2010-12-06 18 views
7

Estoy tratando de crear una representación hexadecimal de algunos datos que deben transmitirse (específicamente, en notación ASN.1). En algunos puntos, necesito convertir datos a su representación hexadecimal. Como los datos se transmiten como una secuencia de bytes, la representación hexadecimal debe rellenarse con un 0 si la longitud es impar.¿Hay alguna forma de agregar un número par de dígitos?

Ejemplo:

>>> hex2(3) 
'03' 
>>> hex2(45) 
'2d' 
>>> hex2(678) 
'02a6' 

El objetivo es encontrar una aplicación simple, elegante para hex2.

Actualmente estoy usando hex, quitando los primeros dos caracteres, luego rellenando la cadena con 0 si su longitud es impar. Sin embargo, me gustaría encontrar una mejor solución para referencia futura. Miré en str.format sin encontrar nada que admita un múltiplo.

+0

Creo que es tan buena como la que obtendrá, excepto, por supuesto, si hay un tesoro escondido en la librería del estándar ... – delnan

Respuesta

7
def hex2(n): 
    x = '%x' % (n,) 
    return ('0' * (len(x) % 2)) + x 
-1

Puede que desee ver el módulo struct, que está diseñado para E/S orientadas a bytes.

import struct 
>>> struct.pack('>i',678) 
'\x00\x00\x02\xa6' 
#Use h instead of i for shorts 
>>> struct.pack('>h',1043) 
'\x04\x13' 
+2

No, esto tiene muy poco que ver con la pregunta. Elimine o actualice su respuesta, por favor. – tzot

7

Para ser totalmente honesto, no estoy seguro de cuál es el problema. Una aplicación directa de lo que usted describe es la siguiente:

def hex2(v): 
    s = hex(v)[2:] 
    return s if len(s) % 2 == 0 else '0' + s 

no necesariamente llamar a este "elegante", pero sin duda lo llaman "simple".

+0

Si 'v' pasa a ser un' long', entonces 'hex (v)' tendrá una 'L' posterior y el valor devuelto por esta función también lo tendrá. – Louis

0

El binascii de Python garantiza la devolución de una cadena de igual longitud.

El truco es convertir el entero en una cadena de bytes. Python3.2 y más alto que se ha incorporado a int:

from binascii import b2a_hex 

def hex2(integer): 
    return b2a_hex(integer.to_bytes((integer.bit_length() + 7) // 8, 'big')) 
Cuestiones relacionadas