eyquem |
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 :
- from struct import unpack
- with open("G:\\Python27\\tcl\\tix8.4.3\\bitmaps\\info.gif", "rb" ) as g:
- g.read(49)
- ss = g.read(13)
- print ' ss ==',ss
- print "\n unpack('14c',ss) ==",unpack('13c',ss)
- print '\n map(ord,ss) ==',map(ord,ss)
- print ' map(hex,map(ord,ss)) ==',map(hex,map(ord,ss))
- print "\n unpack('13B',ss) ==",unpack('13B',ss)
- print "map(hex,unpack('13B',ss)) ==",map(hex,unpack('13B',ss))
|
Résultat:
Code :
- ss == [ÆVÏtyϧŒ\Iz
- unpack('14c',ss) == ('\x10', '[', '\xc6', 'V', '\xcf', 't', 'y', '\xcf', '\xa7', '\x8c', '\\', 'I', 'z')
- map(ord,ss) == [16, 91, 198, 86, 207, 116, 121, 207, 167, 140, 92, 73, 122]
- map(hex,map(ord,ss)) == ['0x10', '0x5b', '0xc6', '0x56', '0xcf', '0x74', '0x79', '0xcf', '0xa7', '0x8c', '0x5c', '0x49', '0x7a']
- unpack('13B',ss) == (16, 91, 198, 86, 207, 116, 121, 207, 167, 140, 92, 73, 122)
- map(hex,unpack('13B',ss)) == ['0x10', '0x5b', '0xc6', '0x56', '0xcf', '0x74', '0x79', '0xcf', '0xa7', '0x8c', '0x5c', '0x49', '0x7a']
|
|