Come archiviate i byte grezzi come testo senza perdere informazioni in Python 2.x?
-
20-08-2019 - |
Domanda
Supponiamo che io abbia dei dati memorizzati in byte. Ad esempio:
0110001100010101100101110101101
Come posso memorizzarlo come stampabile ? Il modo ovvio sarebbe convertire ogni 0 nel carattere '0' e ogni 1 nel carattere '1'. In effetti questo è quello che sto facendo attualmente. Mi piacerebbe sapere come potrei imballarli più strettamente, senza perdere informazioni.
Ho pensato di convertire bit in gruppi di otto in ASCII, ma alcune combinazioni di bit non lo sono accettato in quel formato. Altre idee?
Soluzione
Che dire di una codifica che utilizza solo " sicuro " personaggi come base64?
http://en.wikipedia.org/wiki/Base64
MODIFICA: si presuppone che si desideri archiviare in modo sicuro i dati in file di testo e simili?
In Python 2.x, le stringhe dovrebbero andare bene (Python non usa stringhe con terminazione null, quindi non preoccuparti di ciò).
Altrimenti in 3.x controlla i byte e gli oggetti bytearray. http://docs.python.org/3.0/library/stdtypes. html # byte-metodi
Altri suggerimenti
Non sono sicuro di cosa stai parlando.
>>> 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 stringa sample
contiene tutti i 256 byte distinti. Non esiste una combinazione di "bit" ... non accettata ".
Per renderlo stampabile , usa semplicemente repr (campione)
- i caratteri non ASCII vengono salvati. Come vedi sopra.
Prova il modulo array standard o il modulo struct . Questi supportano la memorizzazione di byte in modo efficiente nello spazio, ma non supportano direttamente i bit.
Puoi anche provare http: //cobweb.ecn. purdue.edu/~kak/dist/BitVector-1.2.html o http: //ilan.schnell-web.net/prog/bitarray/
Per Python 2.x, la soluzione migliore è memorizzarli in una stringa. Una volta che hai quella stringa, puoi codificarla in valori ASCII sicuri usando il modulo base64 fornito con python.
import base64
encoded = base64.b64encode(bytestring)
Questo sarà molto più condensato rispetto alla memorizzazione di "1". e " 0 " ;.
Per ulteriori informazioni sul modulo base64, consultare la docs . p>