2009-08-06 11 views
9

J'ai une chaîne qui a à la fois des caractères binaires et string et je voudrais la convertir en binaire d'abord, puis en hexadécimal.Python: conversion de chaîne binaire/hexadécimale?

La chaîne est comme ci-dessous:

<81>^Q<81>"^Q^@^[)^G ^Q^A^S^A^V^@<83>^Cd<80><99>}^@N^@^@^A^@^@^@^@^@^@^@j 

Comment puis-je aller sur la conversion de cette chaîne en Python pour que la sortie au format hexadécimal est similaire à ce ci-dessous?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F 
+5

peut vous donner des détails sur la traduction prévue? Il me semble que l'exemple de chaîne et la sortie hexadécimale ne sont pas la même chose ... est <81> un seul caractère codé hexadécimalement non imprimable ou est-ce une représentation textuelle de ceci? Je suis confus par la chaine contenant des chariots binaires (que voulez-vous dire par là) et que vous voulez convertir en binaire, puis en hexadécimal ... – Adriaan

+0

Faites ceci: 'print (repr (your_string)))' et copiez/collez le résultat dans votre question. Dites-nous quelle version de Python et quelle plateforme. –

Répondre

22

Vous pouvez utiliser ord et hex comme ceci:

>>> s = 'some string' 
>>> hex_chars = map(hex,map(ord,s)) 
>>> print hex_chars 
['0x73', '0x6f', '0x6d', '0x65', '0x20', '0x73', '0x74', '0x72', '0x69', '0x6e', '0x67'] 
>>> hex_string = "".join(c[2:4] for c in hex_chars) 
>>> print hex_string 
736f6d6520737472696e67 
>>> 

Ou utilisez l'encodage builtin:

>>> s = 'some string' 
>>> print s.encode('hex_codec') 
736f6d6520737472696e67 
>>> 
+1

Votre version avec 'hex' et' ord' ne fonctionne pas de manière fiable. Utilisez "% 2.2x" .__ mod__ au lieu de hex et vous pouvez également éviter le 'c [2: 4]'. En conséquence, cela ressemblerait à: "" ".join (map ("% 2.2x ".__ mod__, map (ord, s)))'. La version d'encodage est bien sûr meilleure. :-) –

+0

Super, répondez !! – Japanish

1

voir une solution plus rapide:

from timeit import Timer 

import os 
import binascii 

def testSpeed(statement, setup = 'pass'): 
    print '%s' % statement 
    print '%s' % Timer(statement, setup).timeit() 

setup = """ 
import os 

value = os.urandom(32) 
""" 

# winner 
statement = """ 
import binascii 

binascii.hexlify(value) 
""" 

testSpeed(statement, setup) 

# loser 
statement = """ 
import binascii 

value.encode('hex_codec') 
""" 

testSpeed(statement, setup) 

Résultats:

import binascii 

binascii.hexlify(value) 

2.18547999816 

value.encode('hex_codec') 

2.91231595077 
7
>>> import binascii 

>>> s = '2F' 

>>> hex_str = binascii.b2a_hex(s) 

>>> hex_str 

>>> '3246' 

OU

>>>import binascii 

>>> hex_str = binascii.hexlify(s) 

>>> hex_str 
>>> '3246' 
>>>