Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File perl文件到十六进制数82?_File_Perl_Hex - Fatal编程技术网

File perl文件到十六进制数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

正在尝试对文件执行二进制到十六进制的转换。我可以输出十六进制,但当我试图将结果输出到文件时,变量返回字符串“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);
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块从操作系统读取时使用1kib
read
,对于文本文件使用
binmode
)现在它起作用了。干杯我已经交换了blockSize以使用“-s$fileName”自动确定文件长度并整理您的评论。它现在可以将十六进制写入文件。谢谢,糟糕的解决方案。它引入了竞争条件和不必要的限制。按照我的建议移动
打开
,这是您应该做的。首先,程序甚至不编译,因此它不会提供您声称的输出。您为输入文件的每个字节重新创建文件(
打开>
),因此您只获得输入文件最后一个字节的输出。在其他问题的循环区之外打开文件(2-arg Open,
printf
没有模式,不需要使用全局变量,当
unpack H*
处理任何长度的字符串时不需要分割输入,当Perl以4kib或8kib块从操作系统读取时使用1kib
read
,对于文本文件使用
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");