提前感谢大家。
我想访问二进制标量的第 n 个字节。例如,您可以在一个标量变量中获取所有文件数据...
想象一下,二进制数据被收集成标量......
open(SOURCE, "<", "wl.jpg");
my $thisByteData = undef;
while(<SOURCE>){$thisByteData .= $_;}
close SOURCE;
$thisByteData 是原始二进制数据。当我使用 length($thisByteData) 时,我得到了字节数,所以 Perl 确实知道它有多大。我的问题是如何访问第 N 个字节?
旁注:我的函数将接收这个二进制标量,它在我的函数中我想访问第 N 个字节。感谢有关如何收集这些数据的帮助,但不是我正在寻找的。无论其他程序员想要以哪种方式收集二进制数据都取决于他们,我的工作是在传递给我时获取第 N 个字节 :)
再次感谢大家的帮助!
感谢@muteW,他让我比以往任何时候都走得更远。我想我没有正确理解 unpack(...) 。
print(unpack("N1", $thisByteData));
print(unpack("x N1", $thisByteData));
print(unpack("x0 N1", $thisByteData));
正在返回以下内容:
4292411360
3640647680
4292411360
我假设这 3 行都将访问相同的(第一个)字节。不使用“x”而只使用“x”和“x$pos”会产生意想不到的结果。
我也试过这个...
print(unpack("x0 N1", $thisByteData));
print(unpack("x1 N1", $thisByteData));
print(unpack("x2 N1", $thisByteData));
返回...与上次测试相同...
4292411360
3640647680
4292411360
我肯定错过了一些关于 unpack 如何工作的东西。
如果我这样做...
print(oct("0x". unpack("x0 H2", $thisByteData)));
print(oct("0x". unpack("x1 H2", $thisByteData)));
print(oct("0x". unpack("x2 H2", $thisByteData)));
我得到了我所期待的...
255
216
255
无需使用 oct() 就不能解压给我自己吗?
作为旁注:我想我在使用“x$pos N1”时得到了这些字节整数的 2 的补码。我期待这些作为前 3 个字节。
255
216
255
再次感谢大家的帮助。
特别感谢@brian d foy 和@muteW ...我现在知道如何使用 unpack(...) 访问我的二进制标量的第 N 个字节。我现在有一个新问题要解决,与这个问题无关。再次感谢所有帮助的家伙!
这给了我想要的结果......
print(unpack("x0 C1", $thisByteData));
print(unpack("x1 C1", $thisByteData));
print(unpack("x2 C1", $thisByteData));
unpack(...) 有很多选项,所以我建议阅读此文件的任何其他人阅读打包/解包文档以获取他们选择的字节数据结果。我也没有尝试使用@brian 提到的 Tie 选项,我想让代码尽可能简单。