我有以下8个字节:
b'\x05\x00\x00\x00\x00\x00\x05\x00'
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用struct.unpack获得两个整数:一个用于前两个字节,一个用于最后一个.获得前两个很容易使用:
struct.unpack("<H6B")
Run Code Online (Sandbox Code Playgroud)
但是,那会回来
(5, 0, 0, 0, 0, 5, 0)
Run Code Online (Sandbox Code Playgroud)
我希望它返回以下内容:
(5, 5)
Run Code Online (Sandbox Code Playgroud)
如何获取最后6个字节的整数值?我不希望每个字节单独.
Die*_*Epp 11
struct不支持非二次幂大小的整数.这很常见.C不支持你的平台上的这样的整数(嗯,位域,但你不能制作那些整数).
def unpack48(x):
x1, x2, x3 = struct.unpack('<HHI', x)
return x1, x2 | (x3 << 16)
Run Code Online (Sandbox Code Playgroud)
标准 struct 模块不支持所有可能的大小,因此您必须自己将一些位连接在一起(请参阅 Dietrich 的答案),或者您可以使用外部模块,例如bitstring。
>>> from bitstring import BitArray
>>> b = BitArray(bytes=b'\x05\x00\x00\x00\x00\x00\x05\x00')
>>> b.unpack('<H6B')
[5, 0, 0, 0, 0, 5, 0]
Run Code Online (Sandbox Code Playgroud)
这与标准相同struct.unpack。但现在我们可以将第二项解压为 6 字节(48 位)小端无符号整数:
>>> b.unpack('<H, uintle:48')
[5, 21474836480]
Run Code Online (Sandbox Code Playgroud)
这给了你与迪特里希的答案相同的结果,并且还表明你的问题有一些错误!在这种情况下你需要的是:
>>> b.unpack('uintle:48, <H')
[5, 5]
Run Code Online (Sandbox Code Playgroud)
请注意,您也可以像想要更一致的符号<H一样编写。uintle:16
| 归档时间: |
|
| 查看次数: |
5952 次 |
| 最近记录: |