Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl打包和解包函数_Perl - Fatal编程技术网

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位浮点数,又名C
float
。这意味着您有一个包含类型和计数信息的字符串,后跟相关的数据字节数。您知道字符串中的数据是以本机字节顺序还是其他顺序显示的吗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