0

我需要帮助,我将一个用 HPBASIC 编写的程序转换为 python 一个 VNA 网络分析器。其数据格式为: 数据传输格式:FMB 选择 IEEE-754 64 位数据传输格式。

二进制数据传输消息格式:

MSB 模式:字节计数字节计数字节

这是一段摘录:

输出@Vna360B;“FMB MSB”!传输格式 64 位,最高有效字节。!FMB(64 位)3068(最大采集点数)。输出@Vna360B;“OFV”!输出频率值。输入@Vna360B;P,S!返回两个整数。输入@Vna360b;频率 (*)!返回数组浮点频率。

这是我通过解码 2.6 Ghz 的值应该得到的 Pyvisa 的结果:

出:['\x00\x08A\x08A\xe3_\x1b@\x00\x00']

我的问题是:这种格式是什么,二进制,六进制?如何让python解码'\x00\x08A\x08A\xe3_\x1b@\x00\x00'?

谢谢您的帮助。

4

1 回答 1

1

格式

数据是字节列表。您可以以多种不同的方式对字节进行解码。例如,我们可以遍历字节并列出解码为整数的字节:

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。

于 2016-11-28T21:57:06.200 回答