Inversion d'octests 32bits en python

Le
vav
Bonjour à tous,

voilà un petit problème que j'essaye de résoudre, j'ai des fichiers
binaires (images) dont je dois faire une inversion de données, en clair
pour chaque mot de 32 bits je dois faire l'opération suivante :

donnée initiale: 12 34 56 78 9A BC DE F0
donnée transformée: 87 65 43 21 0F ED CB A9

j'ai créé le petit bout de code suivant (en m'inspirant d'un sujet de ce
forum^^):

myFile=open("bar.bin","rb")
myString = myFile.read()
myFile.close()
myStringHex=myString.encode('hex')
foo=""
for element2 in range(len(myStringHex)/8):
foo += (myStringHex[element2:element2+8][::-1])
myString2 = foo.decode('hex')
myFileToWrite=open("bar2.bin","wb")
myFileToWrite.write(myString2)
myFileToWrite.close()

Ce bout de code prend énormément de temps (testé sur un fichier 12 mo),
alors qu'avec un logiciel comme winhex le même process est beaucoup plus
rapide, j'ai l'impression de me compliquer la vie pour pas grand-chose,
donc si vous avez une idée sur comment réaliser le même genre d'algo
plus rapidement et dans notre langage préférés, ça serait vraiment sympa.

Merci d'avance,
Vincent
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Laurent Pointal
Le #1964934
Le Mon, 31 Mar 2008 17:56:59 +0200, vav a écrit :

Bonjour à tous,

voilà un petit problème que j'essaye de résoudre, j'ai des fichiers
binaires (images) dont je dois faire une inversion de données, en clair
pour chaque mot de 32 bits je dois faire l'opération suivante :

donnée initiale: 12 34 56 78 9A BC DE F0 ... donnée transformée: 87 65
43 21 0F ED CB A9 ...

j'ai créé le petit bout de code suivant (en m'inspirant d'un sujet de ce
forum^^):

myFile=open("bar.bin","rb")
myString = myFile.read()
myFile.close()
myStringHex=myString.encode('hex')
foo=""
for element2 in range(len(myStringHex)/8):
foo += (myStringHex[element2:element2+8][::-1])
myString2 = foo.decode('hex')
myFileToWrite=open("bar2.bin","wb")
myFileToWrite.write(myString2)
myFileToWrite.close()

Ce bout de code prend énormément de temps (testé sur un fichier 12 mo),
alors qu'avec un logiciel comme winhex le même process est beaucoup plus
rapide, j'ai l'impression de me compliquer la vie pour pas grand-chose,
donc si vous avez une idée sur comment réaliser le même genre d'algo
plus rapidement et dans notre langage préférés, ça serait vraiment
sympa.

Merci d'avance,
Vincent


Tu ne peux pas utiliser le module struct avec les spécificateurs de byte-
order ?

Avec une chaîne de lecture/décodage du genre "<1024i" et une chaîne
d'écriture/encodage du genre ">1024i" (note: j'ai la flegme de regarder
si ça correspond bien aux échanges d'octets correspondant à tes besoins).

Ca te fera la jolie boucle de conversion directement dans le code (C
j'espère) de struct, et par paquets de 1024 valeurs (tu doit pouvoir
augmenter si besoin).

http://docs.python.org/lib/module-struct.html


--
Laurent POINTAL -

Pierre Maurette
Le #1965272
Bonjour à tous,

voilà un petit problème que j'essaye de résoudre, j'ai des fichiers binaires
(images) dont je dois faire une inversion de données, en clair pour chaque
mot de 32 bits je dois faire l'opération suivante :

donnée initiale: 12 34 56 78 9A BC DE F0 ...
donnée transformée: 87 65 43 21 0F ED CB A9 ...


Je n'ai pas le temps de regarder le fond de votre question. Mais je
suis un peu étonné. Vous faites une ccnversion de boutisme mais avec un
"atome" d'un quartet. Êtes-vous certain que vous ne souhaitez pas
plutôt:
donnée transformée: 78 56 34 12 F0 DE BC 9A ...
?

--
Pierre Maurette

Pierre Maurette
Le #1965580
Bonjour à tous,

voilà un petit problème que j'essaye de résoudre, j'ai des fichiers binaires
(images) dont je dois faire une inversion de données, en clair pour chaque
mot de 32 bits je dois faire l'opération suivante :

donnée initiale: 12 34 56 78 9A BC DE F0 ...
donnée transformée: 87 65 43 21 0F ED CB A9 ...

j'ai créé le petit bout de code suivant (en m'inspirant d'un sujet de ce
forum^^):

myFile=open("bar.bin","rb")
myString = myFile.read()
myFile.close()
myStringHex=myString.encode('hex')
foo=""
for element2 in range(len(myStringHex)/8):
foo += (myStringHex[element2:element2+8][::-1])
myString2 = foo.decode('hex')
myFileToWrite=open("bar2.bin","wb")
myFileToWrite.write(myString2)
myFileToWrite.close()

Ce bout de code prend énormément de temps (testé sur un fichier 12 mo), alors
qu'avec un logiciel comme winhex le même process est beaucoup plus rapide,
j'ai l'impression de me compliquer la vie pour pas grand-chose, donc si vous
avez une idée sur comment réaliser le même genre d'algo plus rapidement et
dans notre langage préférés, ça serait vraiment sympa.


Je n'ai pas l'impression que votre code fournisse ce que vous voulez,
si on dépasse les premiers octets.
Si comme suggéré dans mon autre message c'est une inversion sur la base
de l'octet que vous voulez, il me semble que ça fontionne:

s=open("tst.bin","rb").read()
f=open("tst2.bin","wb")
for i in range(0, len(s), 4):
[f.write(s[i + j]) for j in (3, 2, 1, 0)]

--
Pierre Maurette

vav
Le #1976951

Bonjour à tous,

voilà un petit problème que j'essaye de résoudre, j'ai des fichiers
binaires (images) dont je dois faire une inversion de données, en
clair pour chaque mot de 32 bits je dois faire l'opération suivante :

donnée initiale: 12 34 56 78 9A BC DE F0 ...
donnée transformée: 87 65 43 21 0F ED CB A9 ...



Je n'ai pas le temps de regarder le fond de votre question. Mais je suis
un peu étonné. Vous faites une ccnversion de boutisme mais avec un
"atome" d'un quartet. Êtes-vous certain que vous ne souhaitez pas plutôt:
donnée transformée: 78 56 34 12 F0 DE BC 9A ...
?

Bonjour merci pour les réponses, c'est effectivement une transformation

du style suivant qui doit être effectué:
78 56 34 12 F0 DE BC 9A ...

Je vais explorer la piste du module « struct » pour voir ce que je peu
faire.

Merci,
Vincent


Publicité
Poster une réponse
Anonyme