¿Cómo almacena bytes sin procesar como texto sin perder información en python 2.x?
-
20-08-2019 - |
Pregunta
Supongamos que tengo datos almacenados en bytes. Por ejemplo:
0110001100010101100101110101101
¿Cómo puedo almacenarlo como texto imprimible ? La forma obvia sería convertir cada 0 al carácter '0' y cada 1 al carácter '1'. De hecho, esto es lo que estoy haciendo actualmente. Me gustaría saber cómo podría empaquetarlos más estrechamente, sin perder información.
Pensé en convertir bits en grupos de ocho a ASCII, pero algunas combinaciones de bits no son aceptado en ese formato. ¿Alguna otra idea?
Solución
¿Qué pasa con una codificación que solo usa "seguro"? personajes como base64?
http://en.wikipedia.org/wiki/Base64
EDITAR: ¿Eso supone que desea almacenar de forma segura los datos en archivos de texto y demás?
En Python 2.x, las cadenas deberían estar bien (Python no usa cadenas terminadas en nulo, así que no se preocupe por eso).
De lo contrario, en 3.x verifique los bytes y los objetos de matriz de bytes. http://docs.python.org/3.0/library/stdtypes. html # bytes-métodos
Otros consejos
No estoy seguro de lo que estás hablando.
>>> sample = "".join( chr(c) for c in range(256) )
>>> len(sample)
256
>>> sample
'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\
x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABC
DEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83
\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97
\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab
\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf
\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3
\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7
\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb
\xfc\xfd\xfe\xff'
La cadena sample
contiene los 256 bytes distintos. No existen las combinaciones de bits "no aceptadas".
Para que sea imprimible , simplemente use repr (sample)
: se escapan los caracteres que no son ASCII. Como ves arriba.
Pruebe el módulo estándar array o el módulo struct . Estos admiten el almacenamiento de bytes de una manera eficiente en el espacio, pero no admiten bits directamente.
También puede probar http: //cobweb.ecn. purdue.edu/~kak/dist/BitVector-1.2.html o http: //ilan.schnell-web.net/prog/bitarray/
Para Python 2.x, su mejor opción es almacenarlos en una cadena. Una vez que tenga esa cadena, puede codificarla en valores ASCII seguros utilizando el módulo base64 que viene con python.
import base64
encoded = base64.b64encode(bytestring)
Esto estará mucho más condensado que almacenar " 1 " y " 0 " ;.
Para obtener más información sobre el módulo base64, consulte la python docs .