Comment stockez-vous des octets bruts sous forme de texte sans perdre d'informations dans Python 2.x?

StackOverflow https://stackoverflow.com/questions/840981

Question

Supposons que des données soient stockées en octets. Par exemple:

  

011000110001010111010101010111101

Comment puis-je le stocker sous forme de texte imprimable ? La manière évidente serait de convertir chaque 0 en caractère "0" et chaque 1 en caractère "1". En fait c'est ce que je suis en train de faire. J'aimerais savoir comment je pourrais les emballer plus étroitement, sans perdre d'informations.

J'ai pensé à convertir des bits en groupes de huit en ASCII, mais certaines combinaisons de bits ne sont pas accepté dans ce format. D'autres idées?

Était-ce utile?

La solution

Qu'en est-il d'un codage qui utilise uniquement "safe"? des personnages comme base64?
http://fr.wikipedia.org/wiki/Base64

EDIT: Cela suppose que vous souhaitiez stocker les données en toute sécurité dans des fichiers texte, etc.?

Dans Python 2.x, les chaînes devraient être correctes (Python n'utilise pas de chaînes terminées par null, alors ne vous inquiétez pas pour ça).

Sinon, dans 3.x, consultez les octets et les objets bytearray. http://docs.python.org/3.0/library/stdtypes. HTML # octets-méthodes

Autres conseils

Je ne sais pas de quoi vous parlez.

>>> 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 chaîne sample contient les 256 octets distincts. Il n’existe pas de "combinaisons de bits ... non acceptées".

Pour le rendre imprimable , utilisez simplement repr (exemple) - les caractères non-ASCII sont protégés. Comme vous le voyez ci-dessus.

Essayez le module standard array ou le module struct . Ceux-ci prennent en charge le stockage d'octets de manière à optimiser l'espace, mais ils ne prennent pas directement en charge les bits.

Vous pouvez également essayer http: //cobweb.ecn. purdue.edu/~kak/dist/BitVector-1.2.html ou http: //ilan.schnell-web.net/prog/bitarray/

Pour Python 2.x, le mieux est de les stocker dans une chaîne. Une fois que vous avez cette chaîne, vous pouvez l'encoder en valeurs ASCII sûres à l'aide du module base64 fourni avec python.

import base64
encoded = base64.b64encode(bytestring)

Cela sera beaucoup plus condensé que le stockage de "1" et "0".

Pour plus d'informations sur le module base64, consultez le docs .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top