给定十六进制值 0x183C6 我想用3个字节写出相应的字节值。我知道struct会对4个字节执行此操作,但我的约束是3个字节。
所以
>>> val = 0x183c6
>>> struct.pack('>L', val)
'\x00\x01\x83\xc6'
很棒,但我只想要:
'\x01\x83\xc6'
我可以发布进程并在事实之后删除它,我可以将其分解并将每个单独的字节放入bytearray()中,或者可能进行一些位移,但我想知道是否有更简单的方法在struct中执行此操作没有后期处理。
答案 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函数或类似函数几乎没用。