2017-05-16 7 views
0

Il y a beaucoup de messages sur le message d'erreur ValueError: invalid \x escape, cependant, je suis toujours coincé, même si c'est un problème simple. J'essaie de construire une ligne d'octets à partir de différents blocs de construction. A la fin, il doit ressembler à:Ecriture de l'indication hexadécimale ' x', tout en évitant "ValueError: invalid x escape"

b'Kh\x10\x10\x10' 

donc deux symboles ascii au début et à trois valeurs hexadécimaux. J'ai déjà le K (de dict_birdnumbers[int(birdname)]) et le '10' (finangle) en tant que variables. Je l'ai essayé avec une chaîne littérale brute

hex = r'\x' 
line3 = dict_birdnumbers[int(birdname)] + 'h' + hex + finangle + hex + finangle + hex + finangle 
print(line3.encode()) 

J'utilise le .encode() pour faire en sorte que c'est un bytestring. Cependant, le résultat obtenu est

b'Kh\\x10\\x10\\x10' 

donc une barre oblique inverse trop. Si je supprime la barre oblique inverse dans hex, je reçois seulement b'Khx10x10x10'. Si j'utilise une chaîne normale comme hex = '\x' j'obtiens le message d'erreur ValueError: invalid \x escape. Que puis-je faire?

Répondre

1

\xhh est une notation ; chaque séquence \xhh crée un caractère. Vous ne pouvez pas concaténer \x et deux chiffres hexadécimaux pour obtenir le même effet.

Au lieu de cela, il suffit de transmettre une séquence de nombres entiers à bytes():

finagle = int(finangle, 16) # assuming finagle is a hex notation string 
line3 = b'%sh%s' % (
    dict_birdnumbers[int(birdname)].encode('ascii'), 
    bytes([finangle, finangle, finangle]) 
) 

Cela crée un objet bytes avec 3 octets, chacun ayant une valeur de nombre entier 16, la valeur hexadécimale 10. La sortie repr() de bytes arrive à utiliser \xhh pour afficher ces octets parce que l'alternative n'est pas vraiment imprimable (ceci est fait pour toutes les valeurs d'octets non imprimables, ceux en dehors de la gamme ASCII imprimable):

>>> bytes([0x10, 0x10, 0x10]) # 3 integers using hex syntax 
b'\x10\x10\x10' 
+0

Exactement ce que je cherchais! Merci! – Tobitobitobi