field_names = []
for i in range(obj["fields_cnt"]):
print(i)
name_len = struct.unpack('H', f.read(2))[0]
print(type(name_len))
print(type(f.read(name_len)))
print(name_len)
field_names.append(
struct.unpack('<{0}s'.format(name_len), f.read(name_len))[0].decode('latin-1').strip('\x00'))
print("FIELD NAMES:")
print(field_names)
错误:
output:
line 57, in main
struct.unpack('<{0}s'.format(name_len), f.read(name_len))[0].decode('latin-1').strip('\x00'))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
struct.error: unpack requires a buffer of 28261 bytes
我尝试使用calculate()函数,但结果是相同的。 我真的不知道该怎么办..帮助
问题是您将读取字节的单个元素传递到解包中 - 当您执行
f.read(name_len))[0].decode('latin-1').strip('\x00')
时,那里的 [0]
仅从已读取的数据中选取第一个字节。
预计有 28261 字节的数据。 除此之外,您将该一个字节转换为文本字符串(文本) - 它需要字节。对从文件中读取的字节调用
.decode
并传递给 struct.unpack 是没有意义的。
然后对数据调用
strip
:您正在读取一个二进制文件,数据量在两个标头字节中明确显示。如果通过 .strip
调用删除任何字节,它会使数据变短,并且您将再次收到相同的错误。
最后,具有
struct.unpack
数据类型的 s
将仅消耗输入缓冲区的指示数量的字节,并返回包含这些字节的字节字符串。 s
字段作为此类调用中的唯一字段本质上是无操作:您可以直接使用从文件中读取的字节来开始。
因此,在这一行中,有 4 个概念性错误,一个接着一个 - 只需这样做:
`field_names.append(f.read(name_len))' 你应该很好。如果读取的数据应该是文本而不是字节字符串,则对读取的数据调用解码。