如何将三个字节打包到 python 结构中?
How do you pack three bytes into a python struct?
给定一个十六进制值 0x183C6 我想用正好 3 个字节写出它对应的字节值。我知道 struct 会对 4 个字节执行此操作,但我的限制是 3 个字节。
所以
>>> val = 0x183c6
>>> struct.pack('>L', val)
'\x00\x01\x83\xc6'
很棒,但我只想:
'\x01\x83\xc6'
我可以 post 处理并在事后剥离它,我可以将它分解并将每个单独的字节放入 bytearray(),或者可能做一些位移,但我想知道是否有更简单的方法在没有 post 处理的情况下在结构中执行此操作的方法。
你真的不能那样做,因为结构不是这样工作的。如果你绝对知道这个值永远不会超过 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 函数或类似函数几乎毫无用处。
您可以将值拆分为高字节和低 16 位字 divmod
:
>>> struct.pack(">BH", *divmod(0x183c6, 1<<16))
'\x01\x83\xc6'
解压,
>>> struct.unpack(">I", '\x00' + '\x01\x83\xc6')
给定一个十六进制值 0x183C6 我想用正好 3 个字节写出它对应的字节值。我知道 struct 会对 4 个字节执行此操作,但我的限制是 3 个字节。
所以
>>> val = 0x183c6
>>> struct.pack('>L', val)
'\x00\x01\x83\xc6'
很棒,但我只想:
'\x01\x83\xc6'
我可以 post 处理并在事后剥离它,我可以将它分解并将每个单独的字节放入 bytearray(),或者可能做一些位移,但我想知道是否有更简单的方法在没有 post 处理的情况下在结构中执行此操作的方法。
你真的不能那样做,因为结构不是这样工作的。如果你绝对知道这个值永远不会超过 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 函数或类似函数几乎毫无用处。
您可以将值拆分为高字节和低 16 位字 divmod
:
>>> struct.pack(">BH", *divmod(0x183c6, 1<<16))
'\x01\x83\xc6'
解压,
>>> struct.unpack(">I", '\x00' + '\x01\x83\xc6')