[python] fonction chr(), ord() et \x01

fonction chr(), ord() et \x01 [python] - Python - Programmation

Marsh Posté le 11-02-2010 à 19:41:26    

Bonjour, :hello:
 
Je comprend mal quelque chose avec la fonction chr()
 
Ainsi, on a :

Code :
  1. >>>chr(1)
  2. '\x01'


 
Et pour la réciproque, on a :

Code :
  1. >>>ord(\x01)
  2. 1


 
D'après ce que j'ai compris, chr(int) retourne la lettre dont on a indiqué le n° dans la table ASCII.
 
Mais pourquoi, dans le premier cas, n'a t-on pas '1' tout simplement (on a bien 'g' qui est de lecture directe ...) ?
 
Autre question qui en découle : lorsqu'un programme doit traiter le caractère '\x01', comment le transformer pour que, par exemple, lors d'un print il affiche tout simplement '1' dans le terminal (j'entends par là le caractère et non son numéro de position dans la table : par exemple, si j'ai '\x58', j'aimerais qu'il m'affiche bien 'X' et non 88 qui est sa position dans la table ASCII puisque ord('\x58') = ord('X') = 88 ) ?
 
Autrement dit, on a : '\x58' ==ord()==> 88 ==chr()==> 'X'
Mais par contre, on a '\x01' ==ord()==> 1 ==chr()==> '\x01'

Quelle est donc la fonction convert() qui permet : '\x01' ==ord()==> 1 ==convert()==> '1' ?
 
Et accessoirement, comme la réponse à chr() donne tantôt 'X', tantôt '\x01', j'imagine qu'il s'agit d'un ensemble homogène. S'agit-il d'une table d'encodage particulière qui commence ainsi : \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 a b c d e f g ... ?
Ce qui me perturbe vraiment, c'est de trouver chr(88) = 'X' et chr(1) = '\x01' alors que je me serais attendu à avoir :
- soit :  chr(88) = 'X' et chr(1) = '1'
- soit :  chr(88) = '\x58' et chr(1) = '\x01
 
Merci beaucoup si quelqu'un peut éclairer ma lanterne :jap:

Message cité 1 fois
Message édité par Xocs le 11-02-2010 à 20:15:07
Reply

Marsh Posté le 11-02-2010 à 19:41:26   

Reply

Marsh Posté le 11-02-2010 à 22:27:59    

Xocs a écrit :

Bonjour, :hello:

 

Je comprend mal quelque chose avec la fonction chr()

 

Ainsi, on a :

Code :
  1. >>>chr(1)
  2. '\x01'
 

Et pour la réciproque, on a :

Code :
  1. >>>ord(\x01)
  2. 1
 

D'après ce que j'ai compris, chr(int) retourne la lettre dont on a indiqué le n° dans la table ASCII.

 

Mais pourquoi, dans le premier cas, n'a t-on pas '1' tout simplement (on a bien 'g' qui est de lecture directe ...) ?


Parce que l'indice de '1' dans la table ascii (ou plus généralement sont code point) n'est pas 1, mais 49 [:petrus75]

Xocs a écrit :

Autre question qui en découle : lorsqu'un programme doit traiter le caractère '\x01', comment le transformer pour que, par exemple, lors d'un print il affiche tout simplement '1' dans le terminal


Ça n'a strictement aucun sens. \x01 n'est pas un caractère imprimable, et il n'est sûrement pas équivalent à '1'.

Xocs a écrit :

(j'entends par là le caractère et non son numéro de position dans la table : par exemple, si j'ai '\x58', j'aimerais qu'il m'affiche bien 'X' et non 88 qui est sa position dans la table ASCII puisque ord('\x58') = ord('X') = 88 ) ?


Il n'y a pas de caractère imprimable à l'indice 1, il y a un caractère de contrôle nommé "Start of Header" [:petrus75]

Xocs a écrit :

Quelle est donc la fonction convert() qui permet : '\x01' ==ord()==> 1 ==convert()==> '1' ?


Cette question n'a toujours pas le moindre sens.

Xocs a écrit :

Et accessoirement, comme la réponse à chr() donne tantôt 'X', tantôt '\x01', j'imagine qu'il s'agit d'un ensemble homogène. S'agit-il d'une table d'encodage particulière qui commence ainsi : \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 a b c d e f g ... ?


[:petrus75]

 

http://en.wikipedia.org/wiki/Basic [...] age_layout

 

Faut pas partir en vrille comme ça [:petrus75]


Message édité par masklinn le 11-02-2010 à 22:29:59

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

Marsh Posté le 12-02-2010 à 02:11:33    

Ok, ma confusion venait du fait que je recevais des données d'une application qui les codait sur 1 byte.
 
Celle-ci envoyait donc \x01 par exemple pour la valeur 1. Mais je me rends compte désormais que c'était par rapport à la valeur de 1 en octal, et non par rapport à sa traduction en ASCII ... A côté de ça, elle envoie le bon code ASCII en ce qui concerne les lettres ...
 
Un petit mélange des genres !
 
Merci pour ton aide en tout cas :)

Reply

Sujets relatifs:

Leave a Replay

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