-1

У меня есть HEX-файл, содержащий следующее, я хочу разделить их на два HEX-файла на основе адреса:

file_in.hex
@ 00000000
00 FC 00 20 89 01 00 00 D9 01 00 00 DB 01 00 00
ДД 01 00 00 ДФ 01 00 00 E1 01 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 E3 01 00 00
43 00 00 00 10 00 00 20 00 00 00 00
@ 200005FC
18 FB FF 7F 01 00 00 00
@ 20000604
00 00 00 00 80 F0 FA 02 80 F0 FA 02 00 00 00 00
00 00 00 00 FC 02 00 20 64 03 00 20 CC 03 00 20

если адрес равен или больше @ 20000000, остальная часть HEX сохраняется во второй файл HEX, поэтому результат должен быть таким:

file_out1.hex
@ 00000000
00 FC 00 20 89 01 00 00 D9 01 00 00 DB 01 00 00
ДД 01 00 00 ДФ 01 00 00 E1 01 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 E3 01 00 00
43 00 00 00 10 00 00 20 00 00 00 00

file_out2.hex
@ 200005FC
18 FB FF 7F 01 00 00 00
@ 20000604
00 00 00 00 80 F0 FA 02 80 F0 FA 02 00 00 00 00
00 00 00 00 FC 02 00 20 64 03 00 20 CC 03 00 20

Я совершенно новичок в Perl. Могу ли я использовать «сплит», чтобы сделать это? или я должен использовать цикл, чтобы сделать работу? Гораздо проще сделать с помощью awk или gawk?

2 ответа2

0

Это не красиво и не очень неприятно, но должно быть сделано. Предполагается, что адреса только увеличиваются и на самом деле находятся в текстовом файле, как показано @ .

use strict;
use warnings;

my $input = 'file_in.hex';
my $output1 = 'file_out1.hex';
my $output2 = 'file_out2.hex';
my $flipped = 0;

open (my $fh, '<', $input);
open (my $oh, '>', $output1);

while(<$fh>){
    my $line = $_;
    if ($line =~ /[@]/ && !$flipped){
    my $numstr = $line;
    chomp $numstr;
    $numstr =~s/[@]//;
    if(hex($numstr) >= 0x20000000){
        $flipped = 1;
        close $oh;
        open ($oh, '>', $output2);
    }
    }

    print $oh $line;

}

close $oh;
close $fh;
0

попробовать этот Perl-скрипт

#!usr/bin/perl

use strict;
use warnings;


$/ = "20 00 00 00 00";   # set input record separator
my $input = "/path/to/file";
my $i = 0;
open (my $fh, "<", $input);
while (<$fh>){
    my $filename = "$input$i";  #gen new filename
    open (OUT, ">$filename") or die "cannot create file $filename: $!"; #create and write to new file
    print OUT
    $i++;
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .