Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pack ?

1 réponse
Avatar
Paul Bert
Bonjour,

J'ai un fichier contenant des octets (je sais, rien de très original).
Je voudrais lire ce fichier, et rajouter un bit 0 tous les 7 bits. Je me
dis que la fonction pack() ou unpack() doit permettre ce genre de
manipulation, mais je ne comprends pas trop comment faire.

Avant : b0 b1 b2 b3 b4 b5 b6 b7 | b8 b9 b10 ...

Après : 0 b0 b1 b2 b3 b4 b5 b6 | 0 b7 b8 b9 b10 ...

Merci de votre aide.

Paul.

1 réponse

Avatar
jl_morel
Dans l'article <4091f1a0$0$15659$, a
dit...

J'ai un fichier contenant des octets (je sais, rien de très original).
Je voudrais lire ce fichier, et rajouter un bit 0 tous les 7 bits. Je me
dis que la fonction pack() ou unpack() doit permettre ce genre de
manipulation, mais je ne comprends pas trop comment faire.

Avant : b0 b1 b2 b3 b4 b5 b6 b7 | b8 b9 b10 ...

Après : 0 b0 b1 b2 b3 b4 b5 b6 | 0 b7 b8 b9 b10 ...



Je propose :

$apres = pack "b*", '0'.join '0', unpack"(A7)*", unpack "b*", $avant;

Ça se lit de droite à gauche ! Le premier unpack renvoie une chaîne de
caractères 0 et 1, le second unpack decoupe la chaîne en paquets de 7
caractères, le join recolle les morceaux après avoir intercalé des 0 là où
il faut, le dernier pack reconstitue la chaîne modifiée.

Attention : pack et unpack travaillent au niveau de l'octet; on ne peut pas
remplacer les deux unpack successifs par un seul comme :
unpack "(b7)*", $avant
Cette dernière instruction renvoie une liste des 7 premiers bits de
chaque octets et non pas des paquets de 7 bits consécutifs.

Si votre fichier est important il faudra le traiter par enregistrements
dont la longueur est un multiple de 7.

HTH

--
J-L.M.