在perl中将大文件转换为二进制代码

时间:2014-08-13 02:48:59

标签: perl

我是perl的新手并尝试将文件转换为二进制代码并将其另存为文本文件。我已经知道可以使用'unpack'命令完成它。不幸的是unpack只能转换小文件。 perl可以将大文件转换成二进制代码吗?任何帮助将非常感激。这是我的代码:

use strict;
use warnings;

my $readFile = '/file directory';

open READ, $readFile or die "Cant open";
my $input = <READ>;
close READ;

# Convert file into binary code
my $bin = unpack 'B*',$input; 

# Display how much file were converted
print "\nRead ", length($bin)/8000000, ' Mbytes'; 

# Save the binary code into txt file
open(WRITE,">file.txt") or die "\nCan't create txt file";     
print WRITE "$bin";
close WRITE;

2 个答案:

答案 0 :(得分:3)

只是以块的形式进行

#!/usr/bin/perl

use strict;
use warnings;

binmode STDOUT;

for $ARGV (@ARGV ? @ARGV : '-') {
   open(my $fh, $ARGV)
      or warn("Can't open $ARGV: $!\n"), next;

   binmode($fh);

   while (sysread($fh, my $buf, 64*1024)) {
      print(unpack('B*', $buf));
   }
}

用法:

script file.in >file.out

答案 1 :(得分:1)

您遇到大文件问题,因为您要将整个文件加载到内存中。

我建议你利用perlvar中解释的$/技巧:

  

$/设置为对整数的引用,包含整数的标量或可转换为整数的标量将尝试读取记录而不是行,最大记录大小为引用的整数字符数。所以这个:

     1.     local $/ = \32768; # or \"32768", or \$var_containing_32768
     2.     open my $fh, "<", $myfile or die $!;
     3.     local $_ = <$fh>;
     

将从32768读取不超过$fh个字符的记录。

因此,以下脚本可以正常工作:

#!env perl
use strict;
use warnings;

use open IO => ':raw';    # If called as: tobinary.pl infile.bin > out.txt

binmode(STDIN);           # If called as: tobinary.pl < infile.bin > out.txt
binmode(STDOUT);

local $/ = \(1<<16);

while (<>) {
    print unpack 'B*', $_;
}