gpt4 book ai didi

perl - 在 Perl + EOF 处理中将位写入(和读取)二进制文件

转载 作者:行者123 更新时间:2023-12-05 01:09:37 51 4
gpt4 key购买 nike

我有两个相关的问题(在 Perl 中):

  1. 将数据写入二进制文件,格式为:单位标志后8位
  2. 读回相同的格式

我尝试了这个(以及其他变体,但我终究无法弄明白):

binmode(OUT);
my $bit = pack("B1", '1');
my $byte = pack("H2", "02");
print OUT $bit . $byte;

使用十六进制编辑器,我看到我得到了 16 位:

1000000000000020

我要的是9位:

100000020

另外:假设我写出其中两个模式。这意味着我最终得到 9 + 9 = 18 位。我不确定如何处理最后一个字节(填充?)

这是压缩和解压缩文件,空间非常宝贵。我希望有一些我不知道的简单的惯用方法来做到这一点。

最佳答案

文件是字节序列。如果要打印位,则必须使用某种形式的缓冲。

my $bits = '';
$bits .= '1'; # Add 1 bit.
$bits .= unpack('B8', pack('C', 0x02)); # Add 8 bits.
$bits .= substr(unpack('B8', pack('C', 0x02)), -6); # Add 6 bits.

这会打印尽可能多的缓冲区:

my $len = ( length($bits) >> 3 ) << 3;
print($fh, pack('B*', substr($bits, 0, $len, '')));

您最终需要填充缓冲区,以便您拥有 8 位的倍数,以便清除其余部分。您可以简单地用零填充。

$bits .= "0" x ( -length($bits) % 8 );

不过,如果你很聪明,你可以想出一个填充方案来指示文件实际结束的位置。请记住,您不能再依赖文件长度了。如果您不使用智能填充方案,则必须使用其他方法。

智能填充方案的一个示例是:

$bits .= "0";
$bits .= "1" x ( -length($bits) % 8 );

然后,要取消填充,请删除所有尾随 1 位和之前的 0 位。

关于perl - 在 Perl + EOF 处理中将位写入(和读取)二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14290347/

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