Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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_Split_Binary Data_Unpack - Fatal编程技术网

在Perl中将二进制数据拆分为字节数组

在Perl中将二进制数据拆分为字节数组,perl,split,binary-data,unpack,Perl,Split,Binary Data,Unpack,我基本上希望将二进制字符串转换为一个数组/字节列表(以便允许索引,并避免使用substr,因为它的语法使事情变得复杂),我提出了以下建议: 运行此代码会产生以下结果: $ perl test.pl Copied atmp2 contents as hex: 80, 43 Copied atmp2 as ushort (16bit) int: 17280 [17280] lastindex: 10 Argument "M-\0" isn't numeric in pack at test.pl l

我基本上希望将二进制字符串转换为一个数组/字节列表(以便允许索引,并避免使用
substr
,因为它的语法使事情变得复杂),我提出了以下建议:

运行此代码会产生以下结果:

$ perl test.pl
Copied atmp2 contents as hex: 80, 43
Copied atmp2 as ushort (16bit) int: 17280 [17280]
lastindex: 10
Argument "M-\0" isn't numeric in pack at test.pl line 38.
Argument "C" isn't numeric in pack at test.pl line 38.
Copied btmp2 contents as hex: 00, 00
Copied btmp2 as ushort (16bit) int: 0 [0]

如何使第二部分(btmp2)的行为与第一部分(atmp2)相同?

事实证明,当使用
拆分时,它确实创建了一个与原始字符串中相同字节的数组;然而,它似乎还以某种方式将结果数组标记为“文本”,因此进一步的处理失败,并出现“参数不是数字”

答案很简单,就是将
拆分
行替换为使用
解包
的行,而不是:

- my @btmp = split('',$indata);
+ my @btmp = unpack('C*',$indata);

。。。在那之后,所有的工作都如预期的那样(两个打印输出都是相同的)。有趣的是,在这两种情况下,“lastindex”(对于从字符串派生的数组)将显示为10(这使我认为
binmode
可能有问题,这就是为什么代码中都有这些语句)

它确实帮了我的忙,谢谢!我不敢相信回答这个简单的问题有多困难,但我找不到一个Perl文档、手册页或教程可以清楚地解释这一点。。。
- my @btmp = split('',$indata);
+ my @btmp = unpack('C*',$indata);