File perl文件到十六进制数82?
正在尝试对文件执行二进制到十六进制的转换。我可以输出十六进制,但当我试图将结果输出到文件时,变量返回字符串“82”。我不明白为什么;就像所有的事情一样,最有可能是一些简单的事情File perl文件到十六进制数82?,file,perl,hex,File,Perl,Hex,正在尝试对文件执行二进制到十六进制的转换。我可以输出十六进制,但当我试图将结果输出到文件时,变量返回字符串“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 $file
#!/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);
mookie@temple:/srv/bench%cat file.hex
八十二
谢谢
这是我的最终代码。如果发生
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);
使用严格;
我的$fileName=$ARGV[0];
my$hexName=$ARGV[1];
my$hexCodeFile=$ARGV[2];
my$hexDecodeFile=$ARGV[3];
my$blockSize=-s$fileName;
我的$buf;
打开(F,“$hexName”)或死亡(“无法打开文件$hexName,$!”;
读取(F,$buf,$blockSize);
打印H解包(“H*”,$buf);
关闭(H);
关闭(F);
您为输入文件的每个字节重新创建文件(打开>),因此您只获得输入文件最后一个字节的输出。在循环外部打开文件
此外,您会不断追加到$buf
,而不是替换其内容,因此您的输出将看起来像aababcadcdabcde,而不是所需的ABCDE(其中每个字母代表1024字节输入的输出)
固定的:
use strict;
use warnings qw( all );
use constant BLOCK_SIZE => 64*1024;
my ($in_qfn, $out_qfn) = @ARGS;
open(my $in_fh, '<:raw', $in_qfn)
or die("Unable to open \"$in_qfn\": $!\n");
open(my $out_fh, '>', $out_qfn)
or die("Unable to open \"$out_qfn\": $!\n");
while (1) {
defined( my $rv = sysread($in_fh, my $buf, BLOCK_SIZE) )
or die("Unable to read from \"$in_qfn\": $!\n");
last if !$rv;
print($fh_out unpack("H*", $buf))
or die("Unable to write to \"$out_qfn\": $!\n");
}
close($fh_in);
close($fh_out)
or die("Unable to write to \"$out_qfn\": $!\n");
使用严格;
使用警告qw(全部);
使用常量块大小=>64*1024;
my($in_qfn,$out_qfn)=@ARGS;
打开(我的$in_fh,,$out_qfn)
或死亡(“无法打开\“$out\u qfn\”:$!\n”);
而(1){
已定义(my$rv=sysread($in_fh,my$buf,BLOCK_SIZE))
或死亡(“无法读取\“$in_qfn\”:$!\n”);
最后如果!$rv;
打印($fh_out unpack(“H*”,$buf))
或死亡(“无法写入\“$out\u qfn\”:$!\n”);
}
收盘价($fh_in);
结束($fh_out)
或死亡(“无法写入\“$out\u qfn\”:$!\n”);
上述内容解决了您计划中的许多其他问题:
- 使用2-arg打开
- 不带图案的printf的使用
- 不必要地使用全局变量
- 当
处理任意长度的字符串时,不必要地分割输入unpack H*
- Perl以4kib或8kib块从操作系统读取数据时,1kib读取效率低下
- 对文本文件使用binmode
$buf
,而不是替换其内容,因此您的输出将看起来像aababcadcdabcde,而不是所需的ABCDE(其中每个字母代表1024字节输入的输出)
固定的:
use strict;
use warnings qw( all );
use constant BLOCK_SIZE => 64*1024;
my ($in_qfn, $out_qfn) = @ARGS;
open(my $in_fh, '<:raw', $in_qfn)
or die("Unable to open \"$in_qfn\": $!\n");
open(my $out_fh, '>', $out_qfn)
or die("Unable to open \"$out_qfn\": $!\n");
while (1) {
defined( my $rv = sysread($in_fh, my $buf, BLOCK_SIZE) )
or die("Unable to read from \"$in_qfn\": $!\n");
last if !$rv;
print($fh_out unpack("H*", $buf))
or die("Unable to write to \"$out_qfn\": $!\n");
}
close($fh_in);
close($fh_out)
or die("Unable to write to \"$out_qfn\": $!\n");
使用严格;
使用警告qw(全部);
使用常量块大小=>64*1024;
my($in_qfn,$out_qfn)=@ARGS;
打开(我的$in_fh,,$out_qfn)
或死亡(“无法打开\“$out\u qfn\”:$!\n”);
而(1){
已定义(my$rv=sysread($in_fh,my$buf,BLOCK_SIZE))
或死亡(“无法读取\“$in_qfn\”:$!\n”);
最后如果!$rv;
打印($fh_out unpack(“H*”,$buf))
或死亡(“无法写入\“$out\u qfn\”:$!\n”);
}
收盘价($fh_in);
结束($fh_out)
或死亡(“无法写入\“$out\u qfn\”:$!\n”);
上述内容解决了您计划中的许多其他问题:
- 使用2-arg打开
- 不带图案的printf的使用
- 不必要地使用全局变量
- 当
处理任意长度的字符串时,不必要地分割输入unpack H*
- Perl以4kib或8kib块从操作系统读取数据时,1kib读取效率低下
- 对文本文件使用binmode
open>
),因此您只能获得输入文件最后一个字节的输出。在其他问题的循环区之外打开文件(2-arg Open,printf
没有模式,不需要使用全局变量,当unpack H*
处理任何长度的字符串时不需要分割输入,当Perl以4kib或8kib块从操作系统读取时使用1kibread
,对于文本文件使用binmode
)现在它起作用了。干杯我已经交换了blockSize以使用“-s$fileName”自动确定文件长度并整理您的评论。它现在可以将十六进制写入文件。谢谢,糟糕的解决方案。它引入了竞争条件和不必要的限制。按照我的建议移动打开
,这是您应该做的。首先,程序甚至不编译,因此它不会提供您声称的输出。您为输入文件的每个字节重新创建文件(打开>
),因此您只获得输入文件最后一个字节的输出。在其他问题的循环区之外打开文件(2-arg Open,printf
没有模式,不需要使用全局变量,当unpack H*
处理任何长度的字符串时不需要分割输入,当Perl以4kib或8kib块从操作系统读取时使用1kibread
,对于文本文件使用binmode
)现在它起作用了。干杯我已经交换了blockSize以使用“-s$fileName”自动确定文件长度并整理您的评论。它现在可以将十六进制写入文件。谢谢,糟糕的解决方案。它引入了竞争条件和不必要的限制。按照我的建议移动打开
,这是您应该做的。
use strict;
use warnings qw( all );
use constant BLOCK_SIZE => 64*1024;
my ($in_qfn, $out_qfn) = @ARGS;
open(my $in_fh, '<:raw', $in_qfn)
or die("Unable to open \"$in_qfn\": $!\n");
open(my $out_fh, '>', $out_qfn)
or die("Unable to open \"$out_qfn\": $!\n");
while (1) {
defined( my $rv = sysread($in_fh, my $buf, BLOCK_SIZE) )
or die("Unable to read from \"$in_qfn\": $!\n");
last if !$rv;
print($fh_out unpack("H*", $buf))
or die("Unable to write to \"$out_qfn\": $!\n");
}
close($fh_in);
close($fh_out)
or die("Unable to write to \"$out_qfn\": $!\n");