2010-12-24 12 views
26

Python 2.x tiene chr(), que convierte un número en el rango 0-255 en una cadena de bytes con un carácter con ese valor numérico, y unichr(), que convierte un número en el rango 0-0x10FFFF a una cadena Unicode con un carácter con ese punto de código Unicode. Python 3.x reemplaza unichr() con chr(), de acuerdo con su política "Unicode strings are default", pero no puedo encontrar nada que haga exactamente lo que hizo el antiguo chr(). La utilidad 2to3 (de 2.6) deja chr llamadas solo, lo que no está bien en general :(chr() equivalente que devuelve un objeto bytes, en py3k

(Esto es para el análisis y la serialización de un formato de archivo que se define explícitamente en términos de bytes de 8 bits.)

Respuesta

8

Considere el uso de bytearray ((255,)), que funciona de la misma en Py thon2 y Python3. En ambas generaciones de Python, el objeto bytearray resultante puede convertirse a bytes (obj), que es un alias para str() en Python2 y bytes reales() en Python3.

# Python2 
>>> x = bytearray((32,33)) 
>>> x 
bytearray(b' !') 
>>> bytes(x) 
' !' 

# Python3 
>>> x = bytearray((32,33)) 
>>> x 
bytearray(b' !') 
>>> bytes(x) 
b' !' 
26

Pruebe lo siguiente:

b = bytes([x]) 

Por ejemplo:

>>> bytes([255]) 
b'\xff' 
+0

me pongo un poco nerviosa de tirar alrededor de matrices de rascar, pero probablemente no debería. Hace el trabajo, de todos modos. – zwol

+2

@Zack: podría usar '' bytes ((255,)) '' como una variación. – malthe

+6

bytes ((255,)) en Python2 NO le dará b '\ xff' ... en su lugar '(255,)'. –

5
>>> import struct 
>>> struct.pack('B', 10) 
b'\n' 
>>> import functools 
>>> bchr = functools.partial(struct.pack, 'B') 
>>> bchr(10) 
b'\n' 
4

En caso de que desee escribir Python 2/3 código compatible, utilice six.int2byte

+0

No veo por qué sería mejor que la respuesta de Guido, particularmente si no tengo otra necesidad de 'seis'. – zwol

+0

@zwol: Para Python 3.2+, 'int2byte = operator.methodcaller (" to_bytes ", 1," big ")'. Según el comentario, esto es aproximadamente 2 veces más rápido que 'bytes ((...))'. De todos modos, 'int2byte (x)' se ve mejor que 'bytes (bytearray ((x,)))' para mí. – zhangyoufu

+0

La velocidad es buena, pero en lo que provocó la pregunta original, * ninguna dependencia fuera de la biblioteca estándar * fue una preocupación primordial. – zwol

Cuestiones relacionadas