2011-03-14 11 views
5

Digamos que tengo un cierto valor binario:Python: ¿Cómo convierto de binario a base 64 y viceversa?

0b100 

y quiero convertirlo en base 64

haciendo base64.b64decode(0b100) me dice que está a la espera de una cadena, no un int .... ahora, Don No quiero trabajar con cadenas.

Entonces, ¿podría alguien apuntarme en la dirección correcta para convertir números binarios en números base64? ¡Gracias!

= D

+1

¿Realmente desea convertir a radix-64 * número *, o en base 64 de codificación? La conversión a números radix-64 es un cálculo matemático trivial (en cualquier idioma). –

+1

Solo me pregunto si Python tiene algo súper fácil de usar. – NullVoxPopuli

Respuesta

4

Dependiendo de cómo se representa el valor de 0b100

>>> import struct 
>>> val = 0b100 
>>> print struct.pack('I', val).encode('base64') 
BAAAAA== 

Esto dará vuelta a su valor en un entero de 4 bytes en orden de bits nativa, y codificar ese valor en base 64. Debe especificar el ancho de sus datos, ya que base64 está realmente hecho para representar datos binarios en caracteres imprimibles.

Normalmente puede codificar datos como una cadena de bytes a través de las funciones de struct, y luego codificar en base64. Asegúrese de estar utilizando el mismo diseño de datos y endianess al decodificar.

+0

Puede que eso no sea lo que el que pregunta está buscando. Eso convertirá el binario a decimal, y luego la base 64 codificará la representación decimal. Si solo quieres convertir el número a la base 64, es un poco diferente. –

+0

¿Hm? Estoy en base64-codificación de la representación binaria de la misma, como él preguntó. (Inicialmente respondí incorrectamente al leer mal su pregunta, pero desde entonces la he solucionado) – yan

+0

, ¿cómo puede volver? – NullVoxPopuli

0

¿Qué tan grande es su valor binario? Si puede caber en un solo byte, puede usar chr.

>>> base64.b64encode(chr(255)) 
'/w==' 

De lo contrario creo que tendrá que obtener los bytes individuales de ella con un poco de matemática exponencial y disponerlas en big-endian o little-endian, llamando chr varias veces. (Editar: la respuesta de yan con el módulo struct es más fácil :)

Además, debería tener en cuenta que la sintaxis del entero binario es solo eso, sintaxis. El intérprete lo ve solo como otro entero.

>>> (0b0).__class__ 
<type 'int'> 
+0

bien, podría estar en cualquier lugar de 8 bits a 512 bits. = \ – NullVoxPopuli

1

Los literales binarios son solo números enteros normales de python.

>>> 0b100 
<<< 4 

>>> 4 
<<< 4 

Sólo convertir en una cadena y codificarlo base 64 (dándole una cadena que es la representación de la base 64 '4'). No hay nada de malo en este enfoque, es sin pérdidas y simple.

>>> s = str(0b100).encode('base64') 

>>> int(s.decode('base64')) 
<<< 4 

Si lo desea, puede utilizar depósito para convertir el int en una cadena binaria:

>>> bin(int(s.decode('base64'))) 
<<< '0b100' 
Cuestiones relacionadas