包装不同大小的数据为无符号整数的列表(Packing data of different sizes

2019-09-21 13:41发布

我有一组数据表示,我需要在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])    

问题是,我不知道如何在任何一种有效的方式打包该数据。 我一直在努力使用structarray ,但无论我在概念上失去了一些东西还是我只是使用错误的工作工具。

最终,我知道我可以写一个大毛茸茸的函数,用来检查数据类型,做了一堆移位和屏蔽的,ASCII转换为十六进制,我需要构建的数据包。 但是,这似乎是...不雅。

我想,我们有了一个方法可以告诉巨蟒“这是一个数为两个字节长。包起来。另外两个字节数,其追加到最后一个。现在,这是一个字符串,有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 ,因为这需要一个字符串,而不是数字。

希望我做了我的问题清楚。 任何帮助深表感谢!

Answer 1:

您正在使用正确的工具,但你告诉包编码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!!!'


Answer 2:

你可以pack使用你的结构格式整个事情,并使用例如32位字格式解压:

>>> format="cchi"
>>> p=pack(format,"a","b",1,2)
>>> p
'ab\x01\x00\x02\x00\x00\x00'
>>> (z1,z2)=unpack("ii",p)
>>> (z1,z2)
(90721, 2)


文章来源: Packing data of different sizes into a list of unsigned ints