【发布时间】:2012-08-23 20:03:30
【问题描述】:
我有一组数据代表我需要在 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 位 Int 列表,将列表传递给另一个函数,然后 那个 函数将整个 shebang 写入内存。内存写入函数一次接受 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 转换为十六进制,以及构造我需要的数据包。但这似乎……不优雅。
我认为必须有一种方法告诉python“这是一个长两个字节的数字。打包它。另外两个字节的数字,将其附加到最后一个。现在这是一个字符串,有 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,因为它需要一个字符串,而不是数字。
希望我已经把我的问题说清楚了。非常感谢任何帮助!
【问题讨论】: