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);