Perl打包和解压缩功能

时间:2012-01-14 00:50:09

标签: perl

我正在尝试解压缩包含从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 ......

2 个答案:

答案 0 :(得分:4)

首先,您必须关闭#42404并希望以下二进制数据都不是ASCII编号。

$lp =~ s{^#\d+}{};

我不确定“Real 32”是什么格式,但我猜它是一个32位长的单精度浮点数。看the pack docsd是“双精度浮点数”,即64位。所以我试试f这是“单精度”。

@dec = unpack("f*", $lp);

您的数据是big or little endian是否有问题。 df使用您计算机的原生字节序。您可能必须使用><修饰符强制使用字节序。

@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<*。)

相关问题