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

Remplacer un caractère dans un fichier essentiellement binaire

13 réponses
Avatar
Olivier Miakinen
Bonjour,

Mon problème précédent ayant été brillamment résolu par Stéphane
Chazelas, en voici un nouveau.

En fait c'est tout simple. J'ai des fichiers qui commencent par la
chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
pour donner GIF87a. Je suppose que sed a des chances d'y arriver,
mais je crains un bug du fait que le reste du contenu est du binaire
(pour ceux qui n'auraient pas deviné, ce sont des images GIF).

Est-ce que mes craintes sont fondées ? Et si oui, quelle autre option
pour transformer ce 39 hexa en 37 hexa ?

Cordialement,
--
Olivier Miakinen

10 réponses

1 2
Avatar
Olivier Miakinen
Le 19/04/2012 19:53, Olivier Miakinen a écrit :

En fait c'est tout simple. J'ai des fichiers qui commencent par la
chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
pour donner GIF87a. Je suppose que sed a des chances d'y arriver,
mais je crains un bug du fait que le reste du contenu est du binaire
(pour ceux qui n'auraient pas deviné, ce sont des images GIF).



Je viens de trouver une idée, mais je ne sais pas si c'est la
meilleure :

(printf "GIF87"; cut -b 6- ancien_fichier) > nouveau_fichier
Avatar
Nicolas George
Olivier Miakinen , dans le message <jmpjdf$289i$,
a écrit :
En fait c'est tout simple. J'ai des fichiers qui commencent par la
chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
pour donner GIF87a.



echo 7 | dd bs=1 count=1 seek=4 conv=notrunc of=fichier.gif

À tester sur une copie bien entendu.
Avatar
Olivier Miakinen
Le 19/04/2012 20:25, Nicolas George m'a répondu :

En fait c'est tout simple. J'ai des fichiers qui commencent par la
chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
pour donner GIF87a.



echo 7 | dd bs=1 count=1 seek=4 conv=notrunc of=fichier.gif



Pas mal ! Et j'imagine que l'une des deux commandes suivantes devrait
fonctionner tout aussi bien :

echo GIF87a | dd bs=1 count=6 conv=notrunc of=fichier.gif
echo GIF87a | dd bs=6 count=6 conv=notrunc of=fichier.gif

À tester sur une copie bien entendu.



J'y vais de ce pas.
Avatar
Stephane Chazelas
2012-04-19 20:51:43 +0200, Olivier Miakinen:
Le 19/04/2012 20:25, Nicolas George m'a répondu :
>
>> En fait c'est tout simple. J'ai des fichiers qui commencent par la
>> chaîne GIF89a (en ASCII) et je voudrais remplacer le 9 par par un 7
>> pour donner GIF87a.
>
> echo 7 | dd bs=1 count=1 seek=4 conv=notrunc of=fichier.gif

Pas mal ! Et j'imagine que l'une des deux commandes suivantes devrait
fonctionner tout aussi bien :

echo GIF87a | dd bs=1 count=6 conv=notrunc of=fichier.gif
echo GIF87a | dd bs=6 count=1 conv=notrunc of=fichier.gif


[...]

ou

printf GIF87a 1<> fichier.gif

--
Stephane
Avatar
Olivier Miakinen
Le 19/04/2012 20:59, Stephane Chazelas m'a répondu :

echo GIF87a | dd bs=1 count=6 conv=notrunc of=fichier.gif
echo GIF87a | dd bs=6 count=1 conv=notrunc of=fichier.gif




^
(merci pour la correction de ma bourde)

[...]

ou

printf GIF87a 1<> fichier.gif



Allons bon, voilà encore une syntaxe que je ne connaissais pas ! ;-)
Avatar
Olivier Miakinen
Le 19/04/2012 21:20, je répondais à Stephane Chazelas :

printf GIF87a 1<> fichier.gif



Allons bon, voilà encore une syntaxe que je ne connaissais pas ! ;-)



C'est bon, j'ai trouvé. Cette syntaxe est valide dans tous les shells,
y compris le bon vieux /bin/sh des familles ?
Avatar
Stephane Chazelas
2012-04-19 21:31:37 +0200, Olivier Miakinen:
Le 19/04/2012 21:20, je répondais à Stephane Chazelas :
>>
>> printf GIF87a 1<> fichier.gif
>
> Allons bon, voilà encore une syntaxe que je ne connaissais pas ! ;-)

C'est bon, j'ai trouvé. Cette syntaxe est valide dans tous les shells,
y compris le bon vieux /bin/sh des familles ?



Oui, à moins que tu ne veuilles remonter avant le Bourne shell
(1979). Ce n'est valide que dans la famille de shells Bourne
(Bourne, bash, ksh, ash, zsh...), pas dans les familles csh ou
rc.

--
Stephane
Avatar
Olivier Miakinen
Le 19/04/2012 22:12, Stephane Chazelas a écrit :
>>
>> printf GIF87a 1<> fichier.gif

Cette syntaxe est valide dans tous les shells,
y compris le bon vieux /bin/sh des familles ?



Oui, à moins que tu ne veuilles remonter avant le Bourne shell
(1979).



Non, ça me va. :-)

Même si mon besoin est dû à un logiciel trop vieux pour lire le format
GIF89, le shell est bien plus récent que ça sur toutes les machines.

Ce n'est valide que dans la famille de shells Bourne
(Bourne, bash, ksh, ash, zsh...), pas dans les familles csh ou
rc.



Cela va de soi. Personne chez nous n'est maso au point d'écrire des
scripts en csh !

Encore merci.

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 19/04/2012 20:06, je me répondais :

[...] Je suppose que sed a des chances d'y arriver,
mais je crains un bug du fait que le reste du contenu est du binaire
(pour ceux qui n'auraient pas deviné, ce sont des images GIF).



Je viens de trouver une idée, mais je ne sais pas si c'est la
meilleure :

(printf "GIF87"; cut -b 6- ancien_fichier) > nouveau_fichier



Pour info, cette idée d'utiliser 'cut' était encore pire que celle de
chosir 'sed', pour la même raison : au moindre caractère n rencontré
c'est la catastrophe.
Avatar
Hugues
Ce cher Olivier Miakinen <om+ a posté :

Cela va de soi. Personne chez nous n'est maso au point d'écrire des
scripts en csh !



Aaah, [t]csh... Le shell qui m'a appris à utiliser ypchsh :-)

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
1 2