移植解包结构从python 2.7到3

2024-10-01 09:28:39 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码在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,我得到了:

File "Desktop/Test.py", line 2374, in GetMaxNoise

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

TypeError: 'int' does not support the buffer interface

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


Tags: 代码infordatareturnifdef二进制
2条回答

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

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

我不知道您的代码应该做什么以及如何做,但是可能会改变您迭代data对象的方式,以处理int,而是length == 1的{}?在

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

假设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

相关问题 更多 >