Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2005 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Lecture fichier en binaire et valeur en hexa

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lecture fichier en binaire et valeur en hexa

n°1759996
Lithium57
Posté le 16-07-2008 à 00:52:56  profilanswer
 

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.

mood
Publicité
Posté le 16-07-2008 à 00:52:56  profilanswer
 

n°1760056
masklinn
í dag viðrar vel til loftárása
Posté le 16-07-2008 à 09:26:44  profilanswer
 

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
n°1760633
Lithium57
Posté le 17-07-2008 à 01:36:49  profilanswer
 

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
n°2138313
eyquem
Posté le 23-04-2012 à 03:03:50  profilanswer
 


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']

                     


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Lecture fichier en binaire et valeur en hexa

 

Sujets relatifs
modification fichier *.setExtraire lignes d'un fichier .csv avec Visual C++
export table SQL vers fichier[Perl ou Java?] Comment cacher la valeur d'un attribut dans du XML
[PHP] Acceder a un fichier depuis n'importe qu'elle page d'un site ?[DOS]Tester taille d'un fichier ?
exporter depuis php un fichier excel en fichier csvFichier binaire
Véritable valeur aléatoire 
Plus de sujets relatifs à : Lecture fichier en binaire et valeur en hexa


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR