你能帮我理解python中的压缩二进制数据吗
我按照一个示例将24位音频转换为字节 例如:你能帮我理解python中的压缩二进制数据吗,python,Python,我按照一个示例将24位音频转换为字节 例如: struct.pack('<i', 4000000) 你能帮我理解压缩的二进制数据吗 \x00\t=\x00 我们如何解释它 非常感谢 我们可以使用以下方法获得4000000的字节表示: In [14]: x = 4000000
struct.pack('<i', 4000000)
你能帮我理解压缩的二进制数据吗
\x00\t=\x00
我们如何解释它
非常感谢 我们可以使用以下方法获得4000000的字节表示:
In [14]: x = 4000000
In [15]: print("%08X" % x)
003D0900
但在x86和x64机器上,整数首先存储在LSB中,因此内存中的字节将是
00 09 3D 00
这些转换为以下字符:
In [46]: print(b"%c%c%c%c" % (0x00, 0x09, 0x3D, 0x00))
b'\x00\t=\x00'
所以0x09
是\t
,0x3D
是=
我们可以使用ord
、一些位移位和加法重新创建原始值:
In [52]: (ord('=') << 16) + (ord('\t') << 8)
Out[52]: 4000000
可能是我在重新组装时遗漏了0x00
字节,把您弄糊涂了:
In [11]: (0 << 24) + (ord('=') << 16) + (ord('\t') << 8) + 0
Out[11]: 4000000
[11]中的
:(0那么我可以问一下为什么不仅仅是\t=而是\x00\t=\x00?或者为什么不是\x00\t\x00=\x00?非常好的答案。非常干净,帮助我理解。非常感谢你
In [8]: struct.unpack('<i', b'\t=')
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-8-c3b2a260fbdf> in <module>
----> 1 struct.unpack('<i', b'\t=')
error: unpack requires a buffer of 4 bytes
In [10]: struct.unpack('<i', b'\x00\t\x00=\x00')
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-10-8f3448548a2a> in <module>
----> 1 struct.unpack('<i', b'\x00\t\x00=\x00')
error: unpack requires a buffer of 4 bytes
In [11]: (0 << 24) + (ord('=') << 16) + (ord('\t') << 8) + 0
Out[11]: 4000000