Perl 逐位读取二进制文件

Perl 逐位读取二进制文件,perl,binary,Perl,Binary,有没有一种方法可以一点一点地读取二进制文件,而不将其保存为数组 我有一个非常大的二进制文件,我需要一点一点地读取它。将其保存为数组需要很多时间,所以我想防止这种情况。我不在乎文件内容发生了什么 $size = stat($args{file}); my $vector; open BIN, "<$args{file}"; read(BIN, $vector, $size->[7], 0); close BIN; # The code below is the part that t

有没有一种方法可以一点一点地读取二进制文件,而不将其保存为数组

我有一个非常大的二进制文件,我需要一点一点地读取它。将其保存为数组需要很多时间,所以我想防止这种情况。我不在乎文件内容发生了什么

$size = stat($args{file});
my $vector;
open BIN, "<$args{file}";
read(BIN, $vector, $size->[7], 0);
close BIN;

# The code below is the part that takes a lot of time.
my @unpacked = split //, (unpack "B*", $vector);
return @unpacked;
$size=stat($args{file});
我的$vector;

打开BIN,“使用内置函数将Perl标量作为位向量进行操作。

使用特殊的
$/
变量一次读取文件中的1个字节,然后使用逐位运算符检查字节中的每一位。结果应类似于以下内容:

$/ = \1; # read 1 byte at a time
while(<>) {
    my $ord = ord($_);

    # for each bit in the byte
    for(1 .. 8) {
        if($ord & 1) {
            # do 1 stuff
        }
        else {
            # do 0 stuff
        }

        # move onto the next bit
        $ord >>= 1;
    }
}
$/=\1;#一次读取1个字节
while(){
我的$ord=ord($);
#对于字节中的每一位
对于(1..8){
如果($ord&1){
#做一件事
}
否则{
#做零事
}
#转到下一位
$ord>>=1;
}
}

您可以逐字节读取文件…这应该是一个足够小的粒度。但一次读取一兆字节也可以很好地工作,而且效率更高。您需要解释为什么需要一次读取一位。将其保存为数组“不需要很多时间。将整个文件读入内存可能会耗尽内存,但将一个文件读入非常小的块比使用较大的缓冲区要慢得多。该文件包含10亿位!125MB。我没有内存问题,我有运行时问题。。将文件保存到“0”和“1”数组大约需要80分钟!这对我不好。如果阅读125MB需要80分钟,你就做错了。这需要一两秒钟的时间。发布你的代码。看帖子,我刚刚添加了代码。你还没有解释你想用
@unpacket
做什么,以及为什么你需要一个位数组。