格式
数据是字节列表。您可以以多种不同的方式对字节进行解码。例如,我们可以遍历字节并列出解码为整数的字节:
for b in bytearray(b'\x00\x08A\x08A\xe3_\x1b@\x00\x00\x00'):
print(b)
Output:
0
8
65
8
65
227
95
27
64
0
0
0
或者我们可以将每个字节视为一个 ASCII 字符:
for b in bytearray(b'\x00\x08A\x08A\xe3_\x1b@\x00\x00\x00'):
print(b)
Output:
A
A
ã
_
@
请注意,这些字符中的大多数是不可见的。有些是退格字符!ASCII 码表可以显示每个字节是如何被解码的。上述两种方法都分别考虑每个字节。一个字节太小,无法存储您的 2.6 GHz 值。
解码更大的格式
该struct
模块用于将压缩字节数组读入 python 可读值并将 python 值写入字节数组。Struct 是一个内置包,你不必单独安装它。首先,让我们从已知值开始:2.6 GHz。我们将把它打包成一个字节数组,看看它如何与从仪器接收到的值进行比较:
import struct
struct.pack('<d', 2.6e9)
Output:
b'\x00\x00\x00@\x1b_\xe3A'
这看起来就像我们从仪器中读取的数组的末尾!唯一的区别是顺序是向后的。仪器必须使用“big-endian”而不是“little-endian”字节顺序。(要了解有关字节顺序的更多信息,请参阅结构文档。)我们可以使用>
而不是来切换字节顺序<
。
import struct
struct.pack('>d', 2.6e9)
Output:
b'A\xe3_\x1b@\x00\x00\x00'
这完全匹配数组的末尾!(在您的原始示例中,您可能在粘贴结果时切断了其中一个零。)前 4 个字节可能有其他含义,您必须查看网络分析仪的手册以获取详细信息。为了读取字节并转换为浮点数,我们将使用unpack
:
struct.unpack('>d', b'\x00\x08A\x08A\xe3_\x1b@\x00\x00\x00'[4:])
Output:
(2600000000.0,)
输出作为元组返回。由于一个浮点值只存在足够的字节,因此元组的长度为 1。