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

如何将三个字节打包到python结构中?,python,bytearray,pack,Python,Bytearray,Pack,给定一个十六进制值0x183C6,我想用正好3个字节写出它对应的字节值。我知道struct会对4个字节执行此操作,但我的限制是3个字节 所以 很好,但我只想: '\x01\x83\xc6' 我可以在事后对其进行后期处理和剥离,我可以将其分解并将每个字节放入bytearray(),或者进行一些位移位,但我想知道是否有一种更简单的方法可以在struct中进行,而无需后期处理。你不能真正做到这一点,因为struct不是这样工作的。如果您完全知道该值永远不会超过3个字节,则可以对打包和解包使用big-

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

所以

很好,但我只想:

'\x01\x83\xc6'

我可以在事后对其进行后期处理和剥离,我可以将其分解并将每个字节放入bytearray(),或者进行一些位移位,但我想知道是否有一种更简单的方法可以在struct中进行,而无需后期处理。

你不能真正做到这一点,因为struct不是这样工作的。如果您完全知道该值永远不会超过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函数或类似函数几乎是无用的。

您不能这样做,因为结构不是这样工作的。如果您完全知道该值永远不会超过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函数或类似函数几乎毫无用处。

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

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

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

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

看看这个,看看这个,但是你会怎么解包呢?我有一个字节数组,所以我在做:
struct.unpack(“>I”,b'\0'+data)
,对我来说,
“\x00'
不会剪切它。但是你会怎么解包呢?我有一个字节数组,所以我在做:
struct.unpack(“>I”,b'\0'+data)
,对我来说,
“\x00'
不会剪切它。