Perl 你能把文件中的值转换成十六进制吗?
有没有办法将两个文本文件中的值读取为十六进制,并将其总和打印到第三个文件中 例子Perl 你能把文件中的值转换成十六进制吗?,perl,Perl,有没有办法将两个文本文件中的值读取为十六进制,并将其总和打印到第三个文件中 例子 sym.txt 02 01 04 01 sym2.txt 04 0f 07 09 symout.txt 06 10 0b 0a 这就是我尝试过的 use strict; use warnings; use Data::Dumper; open my $fh1, '<', 'sym.txt' or die $!; open my $fh2, '<', 'sym2.txt' or die $!
sym.txt
02 01 04 01
sym2.txt
04 0f 07 09
symout.txt
06 10 0b 0a
这就是我尝试过的
use strict;
use warnings;
use Data::Dumper;
open my $fh1, '<', 'sym.txt' or die $!;
open my $fh2, '<', 'sym2.txt' or die $!;
open my $out, '>', 'symout.txt' or die $!;
while ( !eof( $fh1 ) and !eof( $fh2 ) ) {
my $line1 = <$fh1>;
my $line2 = <$fh2>;
my @l1 = split /\s+/, $line1;
my @l2 = split /\s+/, $line2;
my @newvalues;
my $i = 0;
for ( @l1 ) {
push @newvalues, $_ + $l2[$i];
$i++;
}
print Dumper \@newvalues;
for ( my $i = 0; $i < @newvalues; $i++ ) {
$newvalues[$i] = sprintf( '%3x', $newvalues[$i] );
}
my $new = join( '', @newvalues );
print $out $new . "\n";
}
使用严格;
使用警告;
使用数据::转储程序;
打开我的$fh1,“这对你有用
它可能更复杂,因为它遵循您的示例,并满足具有不同数量的值的记录,并将任何缺少的元素默认为零
我还允许每个总数最多有三个十六进制数字,因为0xFF+0xFF是0x1FE
请注意,在空白处拆分字符串的正确方法是为第一个参数使用单个文本空间<代码>拆分/\s+/
错误
此程序希望两个输入文件的路径作为命令行上的参数
use strict;
use warnings 'all';
open my $fh1, '<', $ARGV[0];
open my $fh2, '<', $ARGV[1];
open my $fh_out, '>', 'symout.txt' or die $!;
until ( eof $fh1 or eof $fh2 ) {
my @l1 = map hex, split ' ', <$fh1>;
my @l2 = map hex, split ' ', <$fh2>;
my $n = @l2 > @l1 ? @l2 : @l1;
my @sum = map {
no warnings 'uninitialized';
$l1[$_] + $l2[$_];
} 0 .. $n-1;
@sum = map { sprintf '%03X', $_ } @sum;
print { $fh_out } "@sum\n";
}
更新
要将每个总和截断为8位,您应该将赋值更改为@sum
,以达到此目的
my @sum = map {
no warnings 'uninitialized';
( $l1[$_] + $l2[$_] ) & 0xFF;
} 0 .. $n-1;
您还可以将
sprint
中的格式说明符更改为%02X
,因为不会有任何大于两位数的十六进制值这与您的情况类似,但中间内容较少,我将用于列表转换,而不是用于循环
use strict;
use warnings;
open(my $in1, '<', 'in1.txt') or die $!;
open(my $in2, '<', 'in2.txt') or die $!;
open(my $out, '>', 'out.txt') or die $!;
while (!eof($in1) && !eof($in2)) {
my @vals1 = split(' ', <$in1>);
my @vals2 = split(' ', <$in2>);
my @sums = map { hex($vals1[$_]) + hex($vals2[$_]) } 0..$#vals1;
print $out join(' ', map { sprintf('%.2x', $_) } @sums) . "\n";
}
close($in1);
close($in2);
close($out);
使用严格;
使用警告;
open(我的$in1,'问题是它不从文件中读取十六进制值,只返回第一个值06…但它返回十六进制值,因为我测试了它Perl没有在十六进制字符串上进行本机加法。使用hex
将它们转换为十进制和sprintf“%x”,…
将十进制转换回十六进制字符串。您的意思是我应该执行类似$line1=hex$a的操作,然后执行$a=sprintf(“%x”,$a);?这将把从in1.txt
中检索到的行中的数字相加。如果相应行中的in2.txt
中有不同的数字,则根据哪一行更长,将丢弃值或打印警告。关闭
调用也没有意义,因为您不知道ndle所有异常print$out join(“”,映射{sprintf('%.2x',$)}@sums)。“\n”
eughAnd如果我想将0xFE+0xFD写为0xFC,因为我想在输出文件0xFF中有最大值,但在第一个和第二个输入文件0xFF+0xFF中可以有最大值。我突然想到另一个问题,如何从特定行获取值,例如:文件1“01 02 03 05 0f”和文件2:“01 04 06 03 0f”我想要文件3中的数字之和,但只需要中间值“考虑到第一个值和最后一个值在文件1和文件2中是相同的,所以应该是“01 06 09 08 0f” @Borodin@Sickofthisschool:您的意思是复制相同的值并添加不同的值?还是复制第1列和第5列并添加第2列、第3列和第4列?在任何情况下,此问题增长太多,您的更改应该作为新问题发布。如果您自己尝试这样做,实际上并不难。我会设置@sum
最初复制到@l1
并添加到@l2
的相关列中,我真的很抱歉这样做,但是…我需要再问一次…我使用@sum=map{sprintf'%01X',$}@sum;并在file1:0000000中输入file2:00000000,结果是“0 0 0 0 0 1e”而不是“0 0 0 0 0 0 1 e”,我对程序做了一些修改,我知道问题出在程序的这一部分…很抱歉在这里提问,但我在接下来的6天内没有问题了。。。
use strict;
use warnings;
open(my $in1, '<', 'in1.txt') or die $!;
open(my $in2, '<', 'in2.txt') or die $!;
open(my $out, '>', 'out.txt') or die $!;
while (!eof($in1) && !eof($in2)) {
my @vals1 = split(' ', <$in1>);
my @vals2 = split(' ', <$in2>);
my @sums = map { hex($vals1[$_]) + hex($vals2[$_]) } 0..$#vals1;
print $out join(' ', map { sprintf('%.2x', $_) } @sums) . "\n";
}
close($in1);
close($in2);
close($out);