Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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