【发布时间】:2019-06-09 12:53:09
【问题描述】:
尝试对文件进行二进制到十六进制的转换。我可以输出十六进制,但是当我尝试将结果输出到文件时,变量返回字符串“82”。我不明白为什么;就像所有的事情很可能是简单的一样。
#!/usr/bin/perl -w
use strict;
my $blockSize = 1024;
my $fileName = $ARGV[0];
my $hexName = $ARGV[1];
open(F,"<$fileName") or die("Unable to open file $fileName, $!");
binmode(F);
my $buf;
my $ct=0;
while(read(F,$buf,$blockSize,$ct*$blockSize)){
foreach(split(//, $buf)){
printf unpack ("H*", $_); #prints the hex stream to terminal just fine
open(H,">$hexName") or die("Unable to open file $fname, $!");
binmode (H);
printf H unpack ("H*", $_);
close (H);
}
print "\n";
$ct++;
}
close(F);
输出
perl rawrHexFile.pl test.png file.hex
89504e470d0a1a0a0000000....
mookie@temple:/srv/bench % cat file.hex 82
cat file.hex
82
谢谢。
这是我的最终代码。如果发生
use strict;
my $fileName = $ARGV[0];
my $hexName = $ARGV[1];
my $hexCodeFile = $ARGV[2];
my $hexDecodeFile = $ARGV[3];
my $blockSize = -s $fileName;
my $buf;
open(F,"<$fileName") or die("Unable to open file $fileName, $!");
binmode(F);
open(H,">$hexName") or die("Unable to open file $hexName, $!");
read(F,$buf,$blockSize);
print H unpack ("H*", $buf);
close (H);
close(F);
【问题讨论】:
-
首先,程序甚至没有编译,所以它没有给你你声称的输出。
-
您为输入文件的每个字节重新创建文件 (
open >),因此您只获得输入文件最后一个字节的输出。在循环外打开文件 -
许多其他问题(2-arg 打开,
printf没有模式,不必要地使用全局变量,当unpack H*处理任何长度的字符串时不必要地拆分输入,1 KiBread当 Perl 从操作系统读取 4 KiB 或 8 KiB 块时,使用binmode作为文本文件) -
现在可以了。干杯! - 我已经交换了 blockSize 以使用“-s $fileName”来自动确定文件长度并与你的 cmets 一起整理。它现在可以将十六进制写入文件。谢谢。
-
糟糕的解决方案。它引入了竞争条件和不必要的限制。按照我的建议移动
open是你应该做的。