2010-10-03 5 views

Répondre

6
>>> text = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'.rstrip('\0') 
>>> print "".join("%02x" % ord(c) for c in text) 
001bd47da4f3 

Selon le commentaire de martineau, voici le chemin Python 3:

>>> "".join(format(ord(c),"02x") for c in text) 
+0

«% 02x' serait mieux. –

+0

OK, je l'ai changé pour utiliser% 02x –

+2

+1 parce que c'est la meilleure réponse et ce n'est pas dépendant de la version Python. – martineau

-4

binascii.hexlify():

import binascii 

byte_string = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
print binascii.hexlify(byte_string.rstrip('\x00')) 

# -> 001bd47da4f3 

Voir @John Machin's answer.

+1

correct, je pense. Il veut supprimer les zéros de queue dans le résultat. –

+0

-1 Bizarre Baroque Byzantine Bassackwards Solution du mois –

+0

@IvovanderWijk: J'ai mis à jour la réponse. Pourriez-vous supprimer votre commentaire désuet? binascii.hexlify() a résisté à l'épreuve du temps (cela fonctionne à la fois sur Python 2/3 ("abc" .encode ('hex') fonctionne uniquement en Python 2 et b "abc" .hex() fonctionne uniquement en Python 3.5+ – jfs

5

Avec python 2.x vous pouvez encoder une chaîne à sa représentation hexadécimale. Il ne fonctionnera pas avec python3.x

>>> print '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'.encode("hex") 
'001bd47da4f300000000000000000000' 

Ce n'est pas tout à fait clair si vous avez une chaîne de caractères contenant les évasions (donc en gros r \ x00 \ x1b »et ainsi de suite) ou non. Aussi, il est difficile de comprendre pourquoi vous ne vous attendez pas les zéros de suivi, mais vous pouvez supprimer ceux avant l'encode en utilisant .rstrip (« \ x00 »)

+0

Bon point sur les possibles évasions intégrées.Étrange aussi que tout le monde utilise l'entrée de l'échantillon, mais personne n'a commenté le fait qu'il est foiré (manquant '7d' et a '}' - encore tous donnent la sortie désirée ... – martineau

+1

} n'a pas besoin d'échappement, mais il aurait échappé à \ x7d. La chaîne est parfaitement logique, mais tous les caractères ne sont pas échappés. –

+0

Il est tout à fait clair à partir de l'entrée et de la sortie de l'OP que l'entrée est '\ x00 \ x1b' etc pas 'x00 \ x1b' etc –

4

Alternative:

[Python 2.7] 
>>> data = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> import binascii 
>>> binascii.b2a_hex(data.rstrip('\x00')) 
'001bd47da4f3' 
>>> 

[Python 3.1.2] 
>>> data = b'\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> import binascii 
>>> binascii.b2a_hex(data.rstrip(b'\x00')) 
b'001bd47da4f3' 
>>> 
+0

'hexlify()' pourrait être plus lisible. – jfs

+1

@ J.F. Sebastian: "hexlify" est idiot, ce n'est même pas un mot valise (qui serait "hexify") alors que quelques secondes sur les docs binascii révèlent que les noms non-idiots suivent un pattern ... b2a_hex signifie "binaire en ascii" , mode hexadécimal " –

+1

FWIW, même si' hexlify() 'un portmanteau" correct "ou vous semble bête, c'est ** l'un des deux noms pour la même fonction dans le module' binascii' - donc Considérez que d'autres ont dû penser que c'est aussi un nom plus descriptif ou plus lisible. – martineau

2

Voici une autre réponse qui devrait Travailler avec toutes les versions de Python à partir de la version 3.x jusqu'à la version 2.0 (version min selon pyqver). Malgré cela, parce qu'il est basé sur une simple table (non dict), il devrait également être relativement rapide.

Une petite installation ponctuelle est nécessaire, mais elle est très simple et évite d'utiliser les nombreuses améliorations qui ont été ajoutées (ou supprimées) en cours de route dans une quête d'indépendance de version.

numerals = "abcdef" 
hexadecimal = [i+j for i in numerals for j in numerals] 

text = '\x00\x1b\xd4}\xa4\xf3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'  
print ''.join([hexadecimal[ord(c)] for c in text.rstrip('\0')]) 
# 001bd47da4f3 
Questions connexes