首页 > 解决方案 > struct unpack(类型错误:需要一个类似对象的字节,而不是“str”),解压列表?

问题描述

尝试使用在 Python 2 中构建的脚本,现在在 Python 3 中使用它而不在系统中添加版本 2。对于脚本,我得到的唯一错误与这一行的 struct.unpack 相关....

def go_parse(rec_list):
    size = (len(rec_list) - 4) / 4
    first_arg = "%sI" % size
    return struct.unpack(first_arg, (rec_list.rstrip ('\xff\xff\xff\xff')))

在此函数的第 4 行,我收到错误:

TypeError: a bytes-like object is required, not 'str'

我阅读了有关此的其他几篇文章,并且需要将其显式标记为字节,但我似乎无法弄清楚在这种情况下在何处显式标记它。我在这里这里找到的关于 SO 的其他示例并没有提供太多解释。struct pages似乎没有涵盖2-3的错误可能性......只有struct.unpack (fmt,buffer)有fmt和buffer这两个参数。基于这些示例,我尝试使用b,以及bytes在参数之前和 .strip 的元组上将其明确标识为字节作为第二个参数。我尝试将其作为 a 返回bytearray,但这似乎产生了相同的错误。

作为替代方案,我能够将我想要的字节数据放入列表中,如下所示,将列表放入解包的方法是什么,尝试 b'i' 只是将 i 视为字节。

list1 = [b'\x03\x00\x00\x00\xff\xff\xff\xff',
b'\x07\x00\x00\x00\x06\x00\x00\x00\xff\xff\xff\xff']

print(struct.unpack('<s', bytes(i)))

字节长度不同,但都以 \xff\xff\xff\xff 结尾。我正在查看的数据是文本,只是试图将其恢复为文本。

标签: pythonpython-3.xstructpython-2to3

解决方案


我在文档中花了一些时间回答了我自己的问题,有人指出我正确的方向。

生成需要带回文本进行显示的二进制数据列表,我使用了编解码器,一个标准库。我所有的二进制数据都保存在一个名为 bin_list 的列表中。

import codecs

bin_list = [b'Some Binary data', b'some more binary data']

for i in bin_list:    # used the loop to print each to new line, nice and neat
    print (codecs.decode(i, "utf-8", "ignore"))   # or any other conversion avilable on codecs.

推荐阅读