struct.pack_into需要更多字节,然后以

时间:2017-02-04 10:09:58

标签: python arrays struct format

Python struct.pack_into,格式为char' x'需要更多的字节。

我正在尝试了解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)

2 个答案:

答案 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}}