我需要帮助,我转换了一个用HPBASIC编写的程序到python的VNA网络分析仪。其数据格式为:数据传输格式: FMB选择IEEE-754 64位数据传输格式。
二进制数据传输消息格式:
MSB模式:字节计数字节计数字节
以下是摘录:
OUTPUT @ Vna360B;"FMB MSB"!传输格式64位,最高有效字节。好了!FMB (64位) 3068 (最大收集点数)。OUTPUT @ Vna360B;"OFV"!输出频率值。输入@ Vna360B;P,S!返回两个整数。输入@ Vna360b;Freqs (*)!返回阵列foat频率。
这是我用Pyvisa解码2.6 Ghz的值应该得到的结果:
输出:'\ x00 \ x08A \ x08A \ xe3_ \ x1b @\ x00 \ x00‘
我的问题是:这是什么格式,二进制,十六进制?如何让python解码'\ x00 \ x08A \ x08A \ xe3_ \ x1b @\ x00 \ x00‘?
谢谢你的帮助。
发布于 2016-11-29 05:57:06
格式
数据是字节列表。您可以通过任意数量的不同方式对字节进行解码。例如,我们可以遍历字节,并将解码后的字节作为整数列出:
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 code table可以向您展示每个字节是如何解码的。上述两种方法都单独考虑每个字节。一个字节太小,无法存储2.6 GHz的值。
解码更大的格式
struct module用于将压缩的字节数组读入python可读的值,并将Python值写入字节数组。Struct是一个内置的包,你不必单独安装它。首先,让我们从已知值开始: 2.6 GHz。我们将把它打包成一个bytearray,看看它与从仪器接收到的值如何比较:
import struct
struct.pack('<d', 2.6e9)
Output:
b'\x00\x00\x00@\x1b_\xe3A'这看起来就像我们从仪器中读取的数组的末尾!唯一的区别是顺序是向后的。仪器必须使用"big-endian“而不是"little-endian”字节顺序。(要了解有关字节顺序的更多信息,请参阅struct docs。)我们可以使用>而不是<来切换字节顺序。
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。
https://stackoverflow.com/questions/40595617
复制相似问题