Perl打包和解包函数
我正在尝试解包一个变量,该变量包含从以下地址接收的字符串:Perl打包和解包函数,perl,Perl,我正在尝试解包一个变量,该变量包含从以下地址接收的字符串: #42404 格式为real 32,使用四个字节存储每个值。数字#42404表示存在4个额外字节,2404/4=收集的601个点。数据在#42404之后开始。现在,当我把它输入到一个字符串变量中时 $lp = ibqry($ud,":TRAC:DATA? TRACE1;*WAI;"); 我不知道如何将其转换为数字数组:(…我应该使用类似followin的东西吗 @dec = un
#42404 格式为real 32,使用四个字节存储每个值。数字#42404表示存在4个额外字节,2404/4=收集的601个点。数据在#42404之后开始。现在,当我把它输入到一个字符串变量中时
$lp = ibqry($ud,":TRAC:DATA? TRACE1;*WAI;");
我不知道如何将其转换为数字数组:(…我应该使用类似followin的东西吗
@dec = unpack("d", $lp);
我知道这不起作用,因为我没有得到正确的值,数据点的数量肯定不是601…首先,你必须去掉
#42404
,希望下面的二进制数据都不是ASCII数字
$lp =~ s{^#\d+}{};
我不确定“Real 32”是什么格式,但我猜它是一个32位长的单精度浮点。看看。d
是“双精度浮点”,即64位。所以我想试试f
这是“单精度”
您的数据是否存在问题。
d
和f
使用计算机的本机endianness。您可能必须使用
和强制endianness,如果第一个4
在浮动之前对剩余位数(2404
)进行编码,则类似的操作可能会起作用:
my@dec=unpack“x a/x f>*”,$lp;
x
跳过前导的#
,a/x
读取一个数字并跳过后面的许多字符,f>*
将剩余的字符串解析为一个32位大端浮点序列。(如果输出看起来很奇怪,请尝试使用w什么是“真正的32”格式?数字表示法…Real 32听起来像Fortran Real*4,一个32位浮点数,又名Cfloat
。这意味着您有一个包含类型和计数信息的字符串,后跟相关的数据字节数。您知道字符串中的数据是以本机字节顺序还是其他顺序显示的吗is将从根本上影响答案。正常模式是字节序列首先以最高有效字节(MSB)开始,然后以最低有效字节(LSB)结束序列中的最后一个:我还可以使用命令在仪器上交换它,交换模式是当字节序列首先以LSB开始,然后以序列中最后一个MSB结束时sequence@user2829发布一个十六进制值转储可能很有用。然后我们可以看到数据是什么。字符音译没有帮助。所以我需要使用pa吗我可以指定要读取的确切字节数吗?数组中只有一个元素:(-77.7630004882813)您正在将二进制数据解包为Perl数据。您可以指定重复该格式的次数,而不是字节数。请参阅在打包文件中,“每个字母后面可以有一个数字,表示重复计数…”。在您的示例中,您可以使用unpack(“f[601]”,$lp)
要从$lp解包601个浮点数。@user2829我的错误是,我忘记了包格式上的*
指示它应该解包多个数字。您可以使用*
或#12345
标题中给出的精确计数……更一般地说,您应该阅读2404(或任何值)然后除以4,然后安排你的包格式读取这么多浮动。非常感谢你的回复:)我很感激。出于某种原因,我仍然只读取62个值。当我打印$#dec时,它会打印61个。但我想如果我收集了601个点:(…@user2829:long是$lp
?如果不是2+4+2404=2410个字符,那么就有问题了。@limari:-我使用的是Perl,所以我想我不需要指定变量的长度,或者我需要指定吗???如果需要,那么怎么做?@user2829:No,您不需要指定长度;所有Perl字符串都知道它们的长度,您可以使用(惊喜!)。
@dec = unpack("f*", $lp);
@dec = unpack("f*>", $lp); # big endian
@dec = unpack("f*<", $lp); # little endian