:-y

Conversion hex2bin

mercredi 19 décembre 2012 - 21:22

Les sites de streaming ça peut être chiant pour récupérer une info, un fichier. Je pense que cette astuce fonctionne pour différents sites (du style Grooveshark)

about:cache?device=memory pour chercher dans le cache de Firefox

clic droit enregistrer sous et vous avez un fichier temporaire html (file.part) qui contient le code hexa de ce qui a été mis en cache entre des balises pre. Une petite ligne de commande et vous obtenez le fichier binaire (file.bin) correspondant. Quelle ligne ?

Celle là (edit : attention ne fonctionne pas correctement car garde </pre> à la fin, voir l'edit d'après pour avoir un code qui fonctionne correctement) :
echo -e -n $(sed -n "/<pre>/,/<\/pre>/ p" file.part | sed -e "s:\ \ : :g" | cut -d " " -f 2-17 | tr -d "[:space:]\n" | sed 's/../\\x&/g') > file.bin

vlc file.bin et c'est la fête :-)

Edit : grâce aux commentaires, une version beaucoup plus rapide (80%) avec awk et xxd :

awk '/<pre>/ { printing=1 }
( printing == 1) {
max = 18; if (NF < 18) { max = NF }
for (i=2; i < max; i++)
printf $(i)
}
/<\/pre>/ { exit }' file.part | xxd -r -p > file.bin

Par contre, je ne suis pas sûr que max = NF si NF < 18 soit suffisant car si un espace est présent dans la représentation ASCII de la dernière ligne, ça risque de bugguer ? Bon dans 99% des cas ce sera bon.

Du coup, je propose cette solution qui semble encore plus rapide et qui devrait marcher tout le temps :
awk '/<pre>/ { p = 1 } /<\/pre>/ { exit } (p == 1) { print }' file.part | cut -d' ' -f 3-33 | xxd -r -p > file.bin

Un mixte entre les commentaires de July et Fred qui semble la meilleure solution :-)

Comments

1 - @ - July

La dernière ligne (</pre>) n'est pas supprimée, ça n'est pas grave sur le format mp3 ceci dit.
En awk, cela semble un peu plus rapide (20% chez moi) :

echo -n -e $( awk '/<pre>/ { printing=1 }
( printing == 1 && NF >= 18 ) {
printf "\\x"$2 "\\x"$3 "\\x"$4 "\\x"$5 "\\x"$6 "\\x"$7 "\\x"$8 "\\x"$9 "\\x"$10 "\\x"$11 "\\x"$12 "\\x"$13 "\\x"$14 "\\x"$15 "\\x"$16 "\\x"$17
}
( printing == 1 && NF < 18 ) {
for (i=2; i < NF; i++ )
printf "\\x"$(i)
}
/\<\\pre\>/ { exit }' file.part ) >file.bin

2 - @ - fred

Plutôt sympa, mais j'ai plein de propositions :þ

Bon, déjà, plutôt que d'enregistrer sous en html, pourquoi ne pas enregistrer sous en txt ?

Ensuite, tu connais ptêtre pas xxd, mais il sait faire comme hexdump, en reverse : xxd -r, du coup, y a juste à transformer au bon format…

Puis sinon, c'est louche, mais mon sed (4.2.1) garde le pattern </pre> en dernière ligne de ta première commande… (awk aussi en fait)

À part ça, en awk je pense que tu devrais te faire moins chier:

awk '/<pre>/,/<\/pre>/{for(i=2;i<=NF-1;i++){printf("%x",$i)}}'

Bon, c'est pas vraiment bon, y a un souci sur la dernière ligne qui ne se comporte pas comme les autres… du coup, en trichant avec un cut préliminaire :

awk '/<pre>/,/<\/pre>/' file.part |cut -d' ' -f3-33 | awk '{for(i=2;i<=NF;i++){printf("%x",$i)}}'

(je passais par un {for(i=2;i<=NF-1;i++){a=a$i}}END{print a} au début, et j'allais mettre ton sed \x après, j'oubliais que awk, c'est top ;])

Bon, j'ai un peu rien testé tout comme il faut, mais l'idée est là !

3 - @ - Tontof

J'avais vu que le </pre> restait après le sed, mais je pensais qu'avec cut, ça l'enlevait mais en fait non :-(

@July : Chez moi, c'est facile 30% plus rapide avec awk

@fred : Pour l'enregistrement c'est un fichier txt en html ? (ou lapin compris). Sinon, non je connaissais pas xxd, c'est génial, ça évite le echo qui prend le plus de temps

(Du coup j'ai édité l'article pour améliorer tout ça, merci à tous les 2)

4 - @ - July

Merci pour xxd, je m'étais posée la question des outils type od/hexdump et voilà donc la réponse :)

Pour le soucis initial, c'est cut qui ne fait rien si le nombre de champs sur une ligne est inférieur à ceux demandés.
New comment







____  __   __            
   / |  \ |  \ |  | |  | 
 _/  |__/ |__/ |\/| |  | 
   \ |    |  \ |  | \  / 
___/ |    |__/ |  |  \/