解包需要 X 字节的缓冲区

问题描述 投票:0回答:1
        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()函数,但结果是相同的。 我真的不知道该怎么办..帮助

python python-3.x file struct byte
1个回答
0
投票

问题是您将读取字节的单个元素传递到解包中 - 当您执行

 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))' 你应该很好。如果读取的数据应该是文本而不是字节字符串,则对读取的数据调用解码。

© www.soinside.com 2019 - 2024. All rights reserved.