2015-09-04 2 views
0

J'ai un problème (peut-être en comprenant) avec le module struct et la méthode pack. Je dois emballer un message pour communiquer avec un capteur. Une valeur de ce message est la représentation ascii d'un nombre entier (dans ce cas "0" et "3"), qui est 48 et 51. Le capteur n'accepte que des valeurs hexadécimales (dans ce cas 30 et 33). Mais quand j'utilise pack('BB',48,51) cela me donne '\ x0003' mais j'ai besoin de '\ x30 \ x33'. Existe-t-il un moyen de convertir ces deux caractères en "hex-binaires"?Chaîne de pack Python en tant que valeur hexadécimale

+0

Il ne vous donne pas '\ x0003'. Il vous donne '' 03 '' car Python affiche les valeurs des octets en caractères ASCII lorsque cela est possible. Ce sont toujours les octets avec les valeurs '\ x30' et' \ x33'. –

+1

Vous devez être plus clair dans ce que vous voulez dire par le fait que le capteur n'accepte que des valeurs hexadécimales, car alors vous devez envoyer les caractères ASCII littéraux '3',' 0' '3' et' 3' (octets 0x33, 0x30, 0x33 et 0x33). –

+0

@Martijn Pieters ♦ Je pensais que si python affichait les valeurs d'octets sous la forme \ x03, il enverrait aussi \ x03. Ma compréhension de la façon dont python affiche et manipule les chaînes d'octets était fausse, la prochaine fois je serai plus clair. – pjaneck

Répondre

2

'\x30\x33' est le même que '03'

>>> import struct 
>>> print struct.pack('BB', 48, 51) 
03 
>>> print '\x30\x33' 
03 
>>> '\x30\x33' == '03' 
True 

'\x30\x33' et '03' sont une représentation différente de la même chose.
'\x30\x33' est défini par leurs valeurs hexadécimales et '03' par des caractères ASCII. A la fin, les deux sont un tableau de deux octets 48 (0x30) et 51 (0x33).

Le capteur accepte uniquement les valeurs hex

Sensor accepte uniquement les octets, il dépend de la façon dont vous avez besoin de coder la valeur.
Avez-vous besoin d'envoyer un numéro 3 ou une chaîne "03"? Si c'est un nombre, vous devrez envoyer "\x03" ou pack("B", 3). Si c'est une chaîne, il suffit d'envoyer "03".

+0

Merci pour votre description détaillée. J'ai découvert, que mon erreur n'était pas du tout liée à la chaîne d'octets mais à un décalage que j'ai appliqué avant l'emballage. (Mettez des parenthèses autour de vos changements de bits!) – pjaneck

0

Si ce n'est pas nessesary utiliser le pack, vous pouvez utiliser quelque chose comme ceci:

'\\'+hex(48)[1:] 
+0

Cela fonctionnera-t-il réellement comme une valeur '\ x' valide? –