【问题标题】:Porting struct.unpack from python 2.7 to 3将 struct.unpack 从 python 2.7 移植到 3
【发布时间】:2015-11-27 23:49:46
【问题描述】:

以下代码在 python 2.7 中运行良好:

def GetMaxNoise(data, max_noise):
    for byte in data:
        noise = ComputeNoise(struct.unpack('=B',byte)[0])
        if max_noise < noise:
            max_noise = noise
    return max_noise

其中 data 是一个包含二进制数据的字符串(取自网络数据包)。

我正在尝试将它移植到 Python 3,我得到了这个:

GetMaxNoise 中的文件“Desktop/Test.py”,第 2374 行

noise = ComputeNoise(struct.unpack('=B',byte)[0])

TypeError: 'int' 不支持缓冲区接口

如何将“数据”转换为 unpack() 所需的适当类型?

【问题讨论】:

    标签: python


    【解决方案1】:

    假设data 变量是您从网络数据包上的二进制文件中获得的字节串,它在Python2 和Python3 中的处理方式不同。

    在 Python2 中,它是一个字符串。当你迭代它的值时,你会得到单字节字符串,你可以用 struct.unpack('=B')[0] 将其转换为 int

    在 Python3 中,它是一个 bytes 对象。当你迭代它的值时,你直接得到整数!所以你应该直接使用:

    def GetMaxNoise(data, max_noise):
        for byte in data:
            noise = ComputeNoise(byte)  # byte is already the int value of the byte...
            if max_noise < noise:
                max_noise = noise
        return max_noise
    

    【讨论】:

    • 在这种情况下,最好的解决方案是删除unpack。你的答案更好:)
    【解决方案2】:

    从结构模块https://docs.python.org/3.4/library/struct.html 的文档中,我看到 unpack 方法期望它是实现缓冲区协议的第二个参数,因此它通常期望bytes

    您的data 对象似乎属于bytes 类型,因为它是从某处读取的。当您使用 for 循环对其进行迭代时,您最终会得到 byte 变量是单个 int 值。

    我不知道你的代码应该做什么以及如何做,但可能会改变你迭代 data 对象的方式来处理不是 ints 而是 byteslength == 1

    for i in range(len(data)):
        byte = data[i:i+1]
        print(byte)
    

    【讨论】:

    • 嗯,它有效,但您这样做只是为了将单个字节保持为 bytes 格式,以便以后能够将它们转换为整数,当直接迭代 bytes 时,会给出相同的结果整数。看起来很像一步​​后退
    猜你喜欢
    • 2015-06-09
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2016-09-07
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多