我正在尝试解压缩包含从spectrum analyzer收到的字符串的变量:
#42404û¢ - + A¢¢-VA¢-oÆ¢-8æ¢-BE -OY¢ - + A¢ - 2 O¢¢-Se -uo¢¢-|ö - =Æ¢¢-8æ - UO¢ - =Æ¢ - \ A¢¢-uo - U¢ - } |?¢ - =Æ¢ - )...
格式为实32,使用四个字节来存储每个值。数字#42404表示存在4个额外字节,2404/4 = 601点收集。数据在#42404之后开始。现在当我收到一个字符串变量时,
$lp = ibqry($ud,":TRAC:DATA? TRACE1;*WAI;");
我不知道如何将其转换为数字数组:( ......我应该使用像followin这样的东西吗?
@dec = unpack("d", $lp);
我知道这不起作用,因为我没有得到正确的值,数据点的数量肯定不是601 ......
答案 0 :(得分:4)
首先,您必须关闭#42404
并希望以下二进制数据都不是ASCII编号。
$lp =~ s{^#\d+}{};
我不确定“Real 32”是什么格式,但我猜它是一个32位长的单精度浮点数。看the pack docs。 d
是“双精度浮点数”,即64位。所以我试试f
这是“单精度”。
@dec = unpack("f*", $lp);
您的数据是big or little endian是否有问题。 d
和f
使用您计算机的原生字节序。您可能必须使用>
和<
修饰符强制使用字节序。
@dec = unpack("f*>", $lp); # big endian
@dec = unpack("f*<", $lp); # little endian
答案 1 :(得分:1)
如果第一个4
在浮点数之前编码剩余数字(2404
)的数量,那么这样的事情可能会有效:
my @dec = unpack "x a/x f>*", $lp;
x
跳过前导#
,a/x
读取一位数并跳过其后的多个字符,f>*
将剩余的字符串解析为序列32位大端浮标。 (如果输出看起来很奇怪,请尝试使用f<*
。)