comment diviser un fichier hexadécimal en deux fichiers hexadécimaux lors de la première correspondance de certains critères dans les scripts Perl ou uniquement les scripts Unix

-1

J'ai un fichier HEX contenant ce qui suit, je veux les séparer en deux fichiers HEX en fonction de l'adresse:

file_in.hex
@ 00000000
00 FC 00 20 89 01 00 00 D9 01 00 00 DB 01 00 00
DD 01 00 00 DF 01 00 00 E1 01 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 E00 01 00 00
43 00 00 00 00 00 00 00 00 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 80 00 00 00
00 00 00 00 00 00 FC 02 00 20 64 03 00 20 CC 03 00 20

si l'adresse est égale ou supérieure à @ 20000000, le reste de l'HEX est sauvegardé dans un deuxième fichier HEX, le résultat devrait donc ressembler à ceci:

file_out1.hex
@ 00000000
00 FC 00 20 89 01 00 00 D9 01 00 00 DB 01 00 00
DD 01 00 00 DF 01 00 00 E1 01 00 00 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 80 0 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

Je suis assez nouveau pour Perl. Puis-je utiliser 'split' pour le faire? ou dois-je utiliser une boucle pour faire le travail? Est-ce que awk ou gawk est beaucoup plus facile à faire?

utilisateur2891070
la source

Réponses:

0

Ce n’est pas très beau ni très beau, mais devrait faire le travail. Cela suppose que les adresses montent seulement, et se trouvent réellement dans le fichier texte, comme indiqué avec le @.

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;
dsolimano
la source
Merci dsolimano. C'est exactement ce à quoi je pensais. mais je n'étais pas sûr de la syntaxe Perl. J'étais pressé, donc pas assez de temps pour faire les recherches. Merci encore.
user2891070
Je remarque que vous utilisez hex (), existe-t-il une fonction similaire pour binaire? Je n'ai rien trouvé jusqu'à présent.
user2891070
Essayez ceci - stackoverflow.com/questions/483655/…
dsolimano
0

essayez ce script 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++;
}
Fegnoid
la source