感谢大家提前。如何访问在Perl二进制标量的第n个字节?
我想访问一个二进制标量的第n个字节。例如,你可以得到所有的文件数据在一个标量变量...
试想一下,二进制数据被收集到标...
open(SOURCE, "<", "wl.jpg");
my $thisByteData = undef;
while(<SOURCE>){$thisByteData .= $_;}
close SOURCE;
$ thisByteData是原始二进制数据。当我使用的长度($ thisByteData)我得到的字节数回,这样的Perl不知道它有多大。我的问题是如何访问第N个字节?
边注:我的功能是要获得这个二进制标量,它在我的功能,我要访问的第N个字节。有关如何收集这些数据的帮助表示赞赏,但不是我所期待的。无论怎样其他程序员要收集二进制数据是由他们决定,我的工作是它传递时,为了获得第N个字节我:)
再次感谢这么多的帮助大家!
感谢@muteW让我获得了前所未有的进步。我想我不理解正确解压(...)。
print(unpack("N1", $thisByteData));
print(unpack("x N1", $thisByteData));
print(unpack("x0 N1", $thisByteData));
还是返回了以下内容:
4292411360
3640647680
4292411360
我会承担这些三线都会访问相同的(第一个)字节。不使用“x”只是“x”和“x $ pos”会产生意想不到的结果。
我也试过这个...
print(unpack("x0 N1", $thisByteData));
print(unpack("x1 N1", $thisByteData));
print(unpack("x2 N1", $thisByteData));
它返回......同样的事情,最后的测试......
4292411360
3640647680
4292411360
我definatly失去了一些东西有关如何解包工作。
如果我这样做...
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
再次感谢所有人的帮助。
特别感谢@布赖恩d FOY和@muteW ......现在我知道如何访问我的二进制使用标解压缩(...)的第N个字节。我现在有一个新问题需要解决,与这个问题无关。再次感谢所有帮助家伙!
这给了我希望的结果......
print(unpack("x0 C1", $thisByteData));
print(unpack("x1 C1", $thisByteData));
print(unpack("x2 C1", $thisByteData));
解包(......)有一吨的选项,因此我建议任何人谁读这读包/解压文件,以获得字节数据结果的选择。我也没有尝试使用@brian提到的Tie选项,我想尽可能简化代码。
请编辑该评论到您原来的问题。 – 2009-07-16 21:30:17
处理二进制数据时,应该在打开文件句柄(即开始读/写之前)后立即在文件句柄上使用`binmode`。 – 2009-07-16 23:17:21
你想做什么?如果你想从图像文件中提取信息,那么可能已经有一个模块可以为你做。 – 2009-07-16 23:40:31