od -An -vtx1 Check.tar > Check.txt
Vous avez besoin de -v
ou od
condensera des séquences d'octets identiques.
Pour l'inverse :
LC_ALL=C tr -cd 0-9a-fA-F < Check.txt | xxd -r -p > Check.tar
Ou :
perl -ape '$_=pack "(H2)*", @F' Check.txt > Check.tar
Si votre objectif est de transférer des fichiers sur un canal qui ne prend en charge que le texte ASCII, il existe des outils dédiés pour cela comme uuencode
:
tar cf - myfiles.* | xz | uuencode myfiles.tar.xz | that-channel
Et pour récupérer ces fichiers à l'autre bout :
uudecode < file.uu
recréerait myfiles.tar.xz
.
Ou :
uudecode -o - < file.uu | xz -d | tar xf -
Pour extraire les fichiers.
En répondant à la partie X de ce problème XY, je vous recommande de rechercher la raison pour laquelle vos transferts de fichiers binaires ne sont pas transférés correctement.
S'il s'avère que la raison est que vous n'avez pas de chemin de données propre de 8 bits, vous pouvez alors utiliser des outils existants qui ont été créés pour gérer cette situation, tels que base64
ou même uuencode
. Vieux mais toujours très efficace.
tar czvf - /etc/h* | base64 >/tmp/tar.tgz.b64
ls -l /tmp/tar.tgz.b64
-rw-r--r-- 1 root root 7364 May 26 11:52 /tmp/tar.tgz.b64
...
base64 -d /tmp/tar.tgz.b64 | tar tzvf -
ou
tar czvf - /etc/h* | uuencode - >/tmp/tar.tgz.uue
ls -l /tmp/tar.tgz.uue
-rw-r--r-- 1 root root 7530 May 26 11:51 /tmp/tar.tgz.uue
...
uudecode /tmp/tar.tgz.uue | tar xzvf -
Dans mon cas, je n'avais pas xxd ou uudecode sur l'appareil distant mais j'avais bash. Je me suis retrouvé avec ce qui suit :
Convertissez du binaire en txt avec :
od -An -vtx1 myfile.bin > myfile.txt
Reconvertissez ensuite de txt en binaire avec :
while read p; do
IFS=' ' read -r -a array <<< "$p"
for index in "${!array[@]}"
do
echo -en "\x${array[index]}"
done
done < myfile.txt > myfile.bin