我是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;
答案 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*', $_;
}