我有一组数据表示,我需要在Python操作的硬件结构。 真正的结构是4 KB大小......我就掀起了一个简单的例子:
Byte(s) Value
0-1 0x0102
2-3 0x0304
4-23 "AStrWith20Characters"
24-63 "WoahThisStringHas40CharactersItIsHuge!!!"
64-71 "Only8Chr"
72-74 0x050607
74 0x08
75-127 0x00 (padding)
这个想法是我包这种结构成的32位整数的列表,通过该列表给另一个函数, 而函数然后写入整个事情出内存。 存储器写出函数接受一次将64个字节,所以我得把两个电话。
所以,上面的例子中,我需要进行这些调用(我会使用可读性大端):
WrToMemory([0x01020304, 0x41537472, 0x57697468, 0x3230436,
0x61726163, 0x74657273, 0x576F6168, 0x5468697,
0x53747269, 0x6E674861, 0x73343043, 0x6861726,
0x63746572, 0x73497449, 0x73487567, 0x65212121])
WrToMemory([0x4F6E6C79, 0x38436872, 0x05060708, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000])
问题是,我不知道如何在任何一种有效的方式打包该数据。 我一直在努力使用struct
和array
,但无论我在概念上失去了一些东西还是我只是使用错误的工作工具。
最终,我知道我可以写一个大毛茸茸的函数,用来检查数据类型,做了一堆移位和屏蔽的,ASCII转换为十六进制,我需要构建的数据包。 但是,这似乎是...不雅。
我想,我们有了一个方法可以告诉巨蟒“这是一个数为两个字节长。包起来。另外两个字节数,其追加到最后一个。现在,这是一个字符串,有20个字节。追加它往前走,直到我们有64个字节。然后,我们只是做64个字节的列表转换成16位无符号整数一个lsit。
这似乎是pack
和unpack
功能,我应该使用什么,但像我上面所说的......我必须失去了一些东西。 如何pack
处理的3字节数,例如? 如果您使用的格式字符串如HB
,然后pack
需要两个参数:
>>> pack('HB', 0x050607)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: pack requires exactly 2 arguments
我不能使用unpack
,因为这需要一个字符串,而不是数字。
希望我做了我的问题清楚。 任何帮助深表感谢!