我正在尝试了解python字节数组,以便能够编写自己的IP,TPC,UDP标头。我在python中使用struct来打包和解包二进制数据,因此指定的类型给出了格式字符串。
ba2 = bytearray(2)
print(ba2, "The size: ", ba2.__len__())
struct.pack_into(">bx", ba2, 1, 1)
print(struct.unpack(">bx", ba2))
现在,当我尝试以">bx"
作为格式打包到长度为2的缓冲区时,根据上面的代码,我收到错误:
bytearray(b'\x00\x00') The size: 2
Traceback (most recent call last):
File "D:/User/Documents/Python/Network/Main.py", line 58, in <module>
bitoperations_bytes_bytearrays_test()
File "D:/User/Documents/Python/Network/Main.py", line 49, in bitoperations_bytes_bytearrays_test
struct.pack_into(">bx", ba2, 1, 1)
struct.error: pack_into requires a buffer of at least 2 bytes
但我有一个2字节的字节数组。
我做错了什么?
请参考一些文档,如果我错过了它(我已阅读python文档,但可能已经错过了它)。
修改
很抱歉,如果我不清楚的话。但我想改变字节数组中的第二个字节。因此,&#39; x&#39;填写格式。
和我一样愚蠢只是排除&#39; x&#39;格式如下:
struct.pack_into(">b", ba2, 1, 1)
并且正确的包装将由Ben制造。有了这个输出:
bytearray(b'\x00\x00') The size: 2
A pack with one byte shift: 0001
(0, 1)
答案 0 :(得分:1)
您需要为pack_into()函数调用另外添加一个参数。第三个参数是必需的,它在目标缓冲区中是偏移的(参考https://docs.python.org/2/library/struct.html)。您的格式也不正确,因为它只需要一个字节。以下代码修复了您的问题:
import struct
ba2 = bytearray(2)
print(ba2, "The size: ", ba2.__len__())
struct.pack_into("bb", ba2, 0, 1, 1)
print(struct.unpack("bb", ba2))
答案 1 :(得分:0)
和我一样愚蠢只是以这样的格式排除'x':
bytearray(b'\x00\x00') The size: 2
A pack with one byte shift: 0001
(0, 1)
并且正确的包装将由Ben制造。有了这个输出:
{{1}}