gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:20:53 24 4
gpt4 key购买 nike

提前感谢大家。

我想访问二进制标量的第 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

我确实遗漏了一些关于解压工作原理的信息。

<小时/>

如果我这样做...

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(...) 有大量选项,因此我建议阅读本文的其他人阅读 pack/unpack 文档以获取他们选择的字节数据结果。我也没有尝试使用 @brian 提到的 Tie 选项,我想让代码尽可能简单。

最佳答案

如果您有字符串中的数据并且想要获取某个字节,请使用 substr ,只要您将字符串视为字节开头即可。

但是,您可以直接从文件中读取它,而无需人们在您的脑海中塞满这些字符串废话。 :) 使用 sysopen 打开文件和正确的选项,使用 seek将自己置于您想要的位置,并通过 sysread 阅读您需要的内容。

您可以跳过 openreadline 尝试为您执行的操作的所有解决方法。如果您只是要关闭它们的所有功能,甚至不要使用它们。

关于perl - 如何在 Perl 中访问二进制标量的第 n 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1140414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com