感谢大家提前.
我想访问二进制标量的第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 …