Python: ¿Cómo convierto de binario a base 64 y viceversa?

Digamos que tengo algún valor binario:

0b100 

y quiere convertirlo a base64

haciendo base64.b64decode(0b100) me dice que está esperando una cadena, no una int … ahora, no quiero trabajar con cadenas.

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

= D

Dependiendo de cómo representes el valor 0b100

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

Esto convertirá su valor en un entero de 4 bytes en el endianness nativo y codificará ese valor en base64. Debe especificar el ancho de sus datos, ya que base64 está hecho para representar datos binarios en caracteres imprimibles.

Por lo general, puede codificar datos como una cadena de bytes a través de las funciones de la estructura y luego codificarlos en base64. Asegúrese de que está utilizando el mismo diseño de datos y endianess al descodificar.

Los literales binarios son simplemente enteros normales de python.

 >>> 0b100 <<< 4 >>> 4 <<< 4 

Simplemente conviértalo en una cadena y codifíquelo en base64 (dándole una cadena que es la representación de base64 de '4'). No hay nada malo con este enfoque, es sencillo y sin pérdidas.

 >>> s = str(0b100).encode('base64') >>> int(s.decode('base64')) <<< 4 

Si lo desea, puede usar bin para convertir el int en una cadena binaria:

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

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

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

De lo contrario, creo que tendrás que sacar los bytes individuales con algunas matemáticas exponenciales y organizarlos en big-endian o little-endian, llamando a chr varias veces. (Editar: la respuesta de yan con el módulo de struct es más fácil 🙂

Además, debo tener en cuenta que la syntax de enteros binarios es solo eso, syntax. El intérprete lo ve como otro entero más.

 >>> (0b0).__class__