Lecture fichier en binaire et valeur en hexa

Lecture fichier en binaire et valeur en hexa - Python - Programmation

Marsh Posté le 16-07-2008 à 00:52:56    

Salut,
 
j'aimerai lire(en python)  un  fichier et obtenir les valeurs en hexa. Mais pour certain byte ca donne le caractère ascii.
Dans cette exemple, pour le 3ème byte ça me donne 'P'  alors je voudrai '\x50' et le 7ème '\n' au lieu de '\x0a'
 
La raison est que je veux afficher ces valeurs pour un utilisateur.
 

Code :
  1. from struct import *
  2. binaryFile = open("xxxx.u08", mode='rb')
  3. print unpack('7c', binaryFile.read(7))


Code :
  1. >>('\x80', '\x80', 'P', '\x00', '\x00', '\x00', '\n')


 
J'ai essayé tous les formats pour unpack, c'est toujours le même chose.
Si quelqu'un à une idée. Ça me rend fou.

Reply

Marsh Posté le 16-07-2008 à 00:52:56   

Reply

Marsh Posté le 16-07-2008 à 09:26:44    

Lithium57 a écrit :

Salut,
 
j'aimerai lire(en python)  un  fichier et obtenir les valeurs en hexa. Mais pour certain byte ca donne le caractère ascii.
Dans cette exemple, pour le 3ème byte ça me donne 'P'  alors je voudrai '\x50' et le 7ème '\n' au lieu de '\x0a'


Ca n'a aucun sens. D'un fichier on lit les caractères (enfin les octets, représentés par des caractères), '\x80' est un caractère unique mais comme la console ne peut pas le représenter elle affiche son codepoint brut [:spamafote]  
 
Si tu veux les valeurs hexa correspondantes, il faut passer "ord" (pour avoir le code "entier" du caractère) puis "hex" dessus, et ça te renverra un ensemble de chaînes correspondant aux valeurs hexa.

Code :
  1. print [hex(ord(c)) for c in unpack('7c', binaryFile.read(7))]


Accessoirement, il est conseillé de ne pas utiliser "from lib import *" quand c'est possible, ça fout le bordel dans le namespace global. Mieux faut faire "import lib" ou "from lib import foo, bar, baz"


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 17-07-2008 à 01:36:49    

Merci, c'est exactement ça que je cherchai.  :jap:  
 

masklinn a écrit :

Ca n'a aucun sens.


 
T'es dur! :sweat:  
 
 
Je prends note pour l'import de lib.


Message édité par Lithium57 le 17-07-2008 à 01:45:29
Reply

Marsh Posté le 23-04-2012 à 03:03:50    


La question n'était pas de savoir pourquoi la console affiche '\x80' (c'est sans doute parce que le moteur d'affichage à l'écran n'utilise pas un charset lui permettant de traduire '\x80' en un caractère affichable; NB la valeur 80 en hexadécimal est 128 en décimal) mais pourquoi elle affiche 'P' au lieu de '\x50' .
 
La raison en est que l'unpacking de la chaîne de 7 octets binaryFile.read(7) lue en mode binaire est fait avec le format '7c' : les éléments qui se retrouvent dans le tuple créé par unpack('7c', binaryFile.read(7)) sont des caractères quand les octets unpackés sont ceux de vrais caractères affichables par print, et sont des chaines exprimant les valeurs hexadécimales des octets quand les octets ne sont pas des codes points de caractères affichables.
 
Ceci étant compris, on n'est pas obligé d'utiliser ord() :
 

Code :
  1. from struct import unpack
  2. with open("G:\\Python27\\tcl\\tix8.4.3\\bitmaps\\info.gif", "rb" ) as g:
  3.     g.read(49)
  4.     ss = g.read(13)
  5. print '                      ss ==',ss
  6. print "\n        unpack('14c',ss) ==",unpack('13c',ss)
  7. print '\n             map(ord,ss) ==',map(ord,ss)
  8. print '    map(hex,map(ord,ss)) ==',map(hex,map(ord,ss))
  9. print "\n         unpack('13B',ss) ==",unpack('13B',ss)
  10. print "map(hex,unpack('13B',ss)) ==",map(hex,unpack('13B',ss))


 
Résultat:
 

Code :
  1. ss == [ÆVÏtyϧŒ\Iz
  2.         unpack('14c',ss) == ('\x10', '[', '\xc6', 'V', '\xcf', 't', 'y', '\xcf', '\xa7', '\x8c', '\\', 'I', 'z')
  3.              map(ord,ss) == [16, 91, 198, 86, 207, 116, 121, 207, 167, 140, 92, 73, 122]
  4.     map(hex,map(ord,ss)) == ['0x10', '0x5b', '0xc6', '0x56', '0xcf', '0x74', '0x79', '0xcf', '0xa7', '0x8c', '0x5c', '0x49', '0x7a']
  5.          unpack('13B',ss) == (16, 91, 198, 86, 207, 116, 121, 207, 167, 140, 92, 73, 122)
  6. map(hex,unpack('13B',ss)) == ['0x10', '0x5b', '0xc6', '0x56', '0xcf', '0x74', '0x79', '0xcf', '0xa7', '0x8c', '0x5c', '0x49', '0x7a']

                     

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed