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?

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top