python - 将不同大小的数据打包到无符号整数列表中

标签 python memory pack unpack

我有一组数据,代表我需要在 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 位整数列表中,将该列表传递给另一个函数,然后该函数将整个 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])    

问题是我不知道如何以任何有效的方式打包这些数据。我一直在努力使用 structarray,但要么我在概念上遗漏了一些东西,要么我只是使用了错误的工具来完成这项工作。

最终,我知道我可以编写一个庞大的函数来检查数据类型,进行一系列移位和屏蔽,将 ASCII 转换为十六进制,并构造我需要的数据包。但这似乎……不优雅。

我认为必须有一种方法告诉python“这是一个两个字节长的数字。将其打包。另一个两个字节的数字,将其附加到最后一个。现在这是一个字符串,有20个字节.追加它。继续直到我们有 64 字节。然后将我们刚刚创建的 64 字节列表转换为 16 个无符号整数的 lsit。

看起来 packunpack 函数是我应该使用的,但就像我上面说的......我一定错过了一些东西。例如,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,因为它需要一个字符串,而不是数字。

希望我已经弄清楚了我的问题。非常感谢任何帮助!

最佳答案

您使用了正确的工具,但您告诉 pack 对 2 个参数进行编码,但仅传入一个参数。

字符串HB表示:打包两个值,一个作为无符号短整型,另一个作为无符号字节。传入两个值就可以了:

>>> pack('HB', 0x0506, 0x07)
'\x06\x05\x07'

只要不断尝试,您就会掌握窍门。以下是示例中的第一组值,采用大端表示法:

>>> pack('>2H20c40c', 0x0102, 0x0304)
'\x01\x02\x03\x04AStrWith20CharactersWoahThisStringHas40CharactersItIsHuge!!!'

注意开头的“>”,这表示字节序。字符串被转换为序列并作为单独的变量应用。一般来说,添加它们会更容易:

>>> pack('>2H20c40c', 0x0102, 0x0304) + "AStrWith20Characters" + "WoahThisStringHas40CharactersItIsHuge!!!"
'\x01\x02\x03\x04AStrWith20CharactersWoahThisStringHas40CharactersItIsHuge!!!'

关于python - 将不同大小的数据打包到无符号整数列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12099131/

相关文章:

python - 将 Spark Dataframe 中的 float 列转换为 VectorUDT

python - 具有公共(public)子键的新字典

python - 如何检查字符串是否只包含大写或小写字母?

Java 异常大的虚拟内存,用于某些环境中的实际内存使用

linux - 将特定的虚拟地址映射到特定的物理地址

c - #Pragma pack 编译时发出警告

python - Django:如何构建食堂菜单预订系统以避免同现预订?

java - 为什么 DoubleBuffer.put() 分配内存,我应该如何避免这种情况发生?

c++ - 用位域打包 bools (C++)

Java 函数 pack()、JFrame 大小