#1 Le 12/09/2011, à 10:34
- MrWaloo
[Résolu] [Perl ou sh] Cloner dd conv=swab
Bonjour,
Je cherche à cloner le fonctionnement de "dd conv=swab" qui permet d'intervertir les octets paires avec les octets impaires dans un fichier binaire. Il gère le dernier octet correctement en cas de nombre total d'octets impaire.
Le truc, c'est que sur un NAS Synology, la commande dd incluse dans BusyBox ne dispose pas de cette option et qu'il ne m'est pas possible d'installer dd, il faudrait que je le compile, avec toutes ses dépendances, ce que je ne veux pas faire sur un serveur de prod.
J'ai donc pensé à "simuler" "dd conv=swab" avec un script, le NAS sait exécuter des scripts shell et des scripts perl.
J'ai donc essayé avec perl, mais dans un fichier binaire, EOF est retrouvé quelque fois dans le fichier et donc <STDIN> termine...
Exemple :
dd if="${source}" | perl -e 'my $v = <STDIN>; $v =~ s/(.)(.)/$2$1/g; print $v;' > "${destination}.dat"
Si vous avez des pistes, je suis preneur...
Le script peut s'exécuter comme on veut :
script source destination
...
Pour mes tests, je prends un fichier .tgz...
A+
Michel
Dernière modification par MrWaloo (Le 12/09/2011, à 13:02)
"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.
Hors ligne
#2 Le 12/09/2011, à 11:07
- grim7reaper
Re : [Résolu] [Perl ou sh] Cloner dd conv=swab
Salut,
Tu as essayé en utilisant STDIN en tant que flux binaire ?
binmode(STDIN);
Parce que par défaut, il me semble bien qu'il est en mode texte et donc qu'il interprète certaines séquences.
Hors ligne
#3 Le 12/09/2011, à 11:37
- MrWaloo
Re : [Résolu] [Perl ou sh] Cloner dd conv=swab
Salut,
Merci pour le conseil, j'avais déjà essayé dans un script un peut plus long (mais malheureusement tout aussi peu efficace).
Ceci ne fonctionne pas non plus :
dd if="${source}" | perl -e ''binmode(STDIN); my $v = <STDIN>; $v =~ s/(.)(.)/$2$1/g; print $v;' > "${destination}.dat"
A+
Michel
"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.
Hors ligne
#4 Le 12/09/2011, à 11:54
- grim7reaper
Re : [Résolu] [Perl ou sh] Cloner dd conv=swab
Bon, et bien je regarderai ça plus en détail ce soir.
Pour le moment je ne peux pas faire de tests.
Dernière modification par grim7reaper (Le 12/09/2011, à 11:54)
Hors ligne
#5 Le 12/09/2011, à 12:19
- MrWaloo
Re : [Résolu] [Perl ou sh] Cloner dd conv=swab
Trouvé pour les fichiers de taille paire !
dd if="${source}" | perl -e 'binmode STDIN; binmode STDOUT; while(<STDIN>){ $_ =~ s/(.)(.)/$2$1/g; print ;}' > "${destination}.dat"
Plusieurs suppositions :
- binmmode sur STDOUT aussi
- ne pas stocker dans une variable intermédiaire qui pourrait "casser" le binmode (à part $_)
Ça le fait sur des fichiers de taille paire (ex 123456 octets), je testerai l'autre cas...
"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.
Hors ligne
#6 Le 12/09/2011, à 13:01
- MrWaloo
Re : [Résolu] [Perl ou sh] Cloner dd conv=swab
Testé, ça fonctionne aussi avec les fichiers dont la taille en octets est impaire.
"De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent !!" (Desproges)
UNIX is an operating system, OS/2 is half an operating system, Windows is a shell, MS-DOS is a boot sector virus.
Hors ligne