Re: byte swapping

Page principale

Répondre à ce message
Auteur: Marc TERRIER
Date:  
À: Habib Bouaziz-Viallet
CC: Liste Guilde
Sujet: Re: byte swapping
Habib Bouaziz-Viallet a écrit :
>
>
> Le 21/10/06, *Edgar Bonet* <guilde@???
> <mailto:guilde@edgar-bonet.org>> a écrit :
>
>     Le samedi 21 octobre, Habib Bouaziz-Viallet a écrit :
>      > Le sujet est dans le titre. Je cherche une méthode simple pour
>     effectuer un
>      > byte-swapping d'un fichier hexadecimal.

>
>     C'est quoi un fichier hexadécimal ? Je suppose que tu parles de binaire
>     et non pas d'un fichier texte avec des valeurs écrites en hexa.

>
>
> C'est un fichier ASCII dont les valeurs sont (pour nous) des
> hexadécimaux. Il se trouve que ton script - et aussi celui de Marc
> Terrier - répondent tous deux à ce que je recherche. Merci beaucoup.
>
>     Le programme suivant devrait faire l'affaire pour des petits fichiers.
>     Si le fichier est gros, c'est pas terrible, car il avale tout en
>     mémoire
>     avant de le ressortir.

>
>     ------------------------------------------------------------------------
>     #!/usr/bin/perl

>
>     local $/; # slurp
>     $file = <>;
>     print pack("n*", unpack("v*", $file));
>     ------------------------------------------------------------------------

>
>     Edgar, en direct de l'install-party.

>
>
>
>
> --
> M. Bouaziz-Viallet


Re-bonjour,

Voici une version rectifiée de mon script de tout à l'heure, qui gère
maintenant de façon correcte les fichiers de taille impaire, et auquel
on peut indiquer en ligne de commande le nom du fichier à traiter.

#!/usr/bin/perl -w

use File::stat;

die "\nUsage : ./endian.pl fichier_a_convertir [ > fichier_resultat ]\n"
unless @ARGV;

$fichier = $ARGV[0];

open ( FICHIER, $fichier ) or die "Je ne peux pas ouvrir $fichier : $!";

stat ( $fichier ); $taille = -s _;

binmode ( FICHIER ); binmode ( STDOUT );

while ( read ( FICHIER, $octet_1, 1 ) && read ( FICHIER, $octet_2, 1 ))
{ print STDOUT $octet_2, $octet_1; }

if ( $taille % 2 == 1 ) { print STDOUT $octet_1; }

close ( FICHIER );

Les mesures de consommation mémoire que j'ai faites ne sont pas très
fines ( c'est le moins qu'on puisse dire ), mais il me semble que ce
script n'a pas de raison d'être gêné par les GROS fichiers, puisqu'il
traite les octets au fil de l'eau.

--
Marc TERRIER
Mail : marc.terrier[at]free.fr
Site : http://marc.terrier.free.fr
#!/usr/bin/perl -w

use File::stat;

die "\nUsage : ./endian.pl fichier_a_convertir [ > fichier_resultat ]\n" unless @ARGV;

$fichier = $ARGV[0];

open ( FICHIER, $fichier ) or die "Je ne peux pas ouvrir $fichier : $!";

stat ( $fichier ); $taille = -s _;

binmode ( FICHIER ); binmode ( STDOUT );

while ( read ( FICHIER, $octet_1, 1 ) && read ( FICHIER, $octet_2, 1 ))
{ print STDOUT $octet_2, $octet_1; }

if ( $taille % 2 == 1 ) { print STDOUT $octet_1; }

close ( FICHIER );