小编rak*_*van的帖子

如何在Perl中访问二进制标量的第n个字节?

感谢大家提前.

我想访问二进制标量的第n个字节.例如,您可以在一个标量变量中获取所有文件数据...

想象一下,二进制数据被收集到标量中......

open(SOURCE, "<", "wl.jpg"); 
my $thisByteData = undef; 
while(<SOURCE>){$thisByteData .= $_;} 
close SOURCE; 
Run Code Online (Sandbox Code Playgroud)

$ thisByteData是原始二进制数据.当我使用length($ thisByteData)时,我得到了字节数,所以Perl知道它有多大.我的问题是如何访问第N个字节?

旁注:我的函数将接收这个二进制标量,它在我的函数中,我想访问第N个字节.关于如何收集这些数据的帮助是值得赞赏的,但不是我正在寻找的.无论其他程序员想要收集二进制数据的方式取决于他们,我的工作是在传递给我时获取第N个字节:)

再次感谢所有人的帮助!


感谢@muteW让我比以往任何时候都更进一步.我想我不理解unpack(...)正确.

print(unpack("N1", $thisByteData));
print(unpack("x N1", $thisByteData));
print(unpack("x0 N1", $thisByteData));
Run Code Online (Sandbox Code Playgroud)

返回以下内容:

4292411360
3640647680
4292411360
Run Code Online (Sandbox Code Playgroud)

我假设这3行都会访问相同的(第一个)字节.不使用"x"只是"x"和"x $ pos"会产生意想不到的结果.

我也尝试过这个......

print(unpack("x0 N1", $thisByteData));
print(unpack("x1 N1", $thisByteData));
print(unpack("x2 N1", $thisByteData));
Run Code Online (Sandbox Code Playgroud)

返回...与上次测试相同...

4292411360
3640647680
4292411360
Run Code Online (Sandbox Code Playgroud)

我肯定错过了一些关于unpack如何工作的东西.


如果我这样做......

print(oct("0x". unpack("x0 H2", $thisByteData)));
print(oct("0x". unpack("x1 H2", $thisByteData)));
print(oct("0x". unpack("x2 H2", $thisByteData)));
Run Code Online (Sandbox Code Playgroud)

我得到了我所期待的......

255
216
255
Run Code Online (Sandbox Code Playgroud)

无需使用oct()就无法解压缩给我自己?


作为旁注:我认为在使用"x $ pos N1"时,我得到了这些字节整数的2的补码.我期待这些作为前3个字节.

255
216
255
Run Code Online (Sandbox Code Playgroud)

再次感谢所有人的帮助.


特别感谢@brian d foy和@muteW …

perl loops bytearray

5
推荐指数
2
解决办法
5461
查看次数

标签 统计

bytearray ×1

loops ×1

perl ×1