如何将三个字节打包到python结构中?

时间:2016-03-28 17:45:50

标签: python bytearray pack

给定十六进制值 0x183C6 我想用3个字节写出相应的字节值。我知道struct会对4个字节执行此操作,但我的约束是3个字节。

所以

>>> val = 0x183c6
>>> struct.pack('>L', val)
'\x00\x01\x83\xc6'

很棒,但我只想要:

'\x01\x83\xc6'

我可以发布进程并在事实之后删除它,我可以将其分解并将每个单独的字节放入bytearray()中,或者可能进行一些位移,但我想知道是否有更简单的方法在struct中执行此操作没有后期处理。

2 个答案:

答案 0 :(得分:2)

您可以使用divmod将值拆分为高字节和低16位字:

>>> struct.pack(">BH", *divmod(0x183c6, 1<<16))
'\x01\x83\xc6'

要打开包装,

>>> struct.unpack(">I", '\x00' + '\x01\x83\xc6')

答案 1 :(得分:1)

你真的不能这样做,因为那不是结构的运作方式。如果您完全知道该值永远不会超过3个字节,则可以使用big-endian编码进行打包和解包:

>>> val = 0x183c6
>>> packed = struct.pack('>L', val)[1:]
>>> packed
'\x01\x83\xc6'
>>> '{0:x}'.format(struct.unpack('>L', '\x00' + packed)[0])
'183c6'

请注意,打包值对于传递给其他C函数或类似函数几乎没用。