rappresentazione binaria in Python e mantenendo gli zeri iniziali

5

Volevo usare la libreria Python base64 per codificare una sequenza di cifre binarie nella base 64. Sarebbe possibile farlo senza convertire una stringa? In caso contrario, qual è il modo migliore per farlo, assumendo che la mia stringa di cifre 1/0 non possa essere un multiplo intero di 8, potrebbe anche essere un numero dispari.

Inoltre, ho la seguente domanda: è possibile assegnare una stringa binaria specifica a una variabile? Ad esempio,

x = 0b00010101010
y = 0b1110000  

Voglio che x mantenga i tre zeri iniziali e vorrei poterli concatenare per ottenere

z = 0b000101010101110000
    
posta user60143 26.07.2012 - 01:55
fonte

2 risposte

3

In Python, la notazione di rappresentazione binaria 0b è solo un altro modo di scrivere numeri interi. Quindi non c'è differenza, ad esempio, tra 0b11 e 0b0011 - entrambi rappresentano il numero intero 3 .

Inoltre, la codifica base64 è progettata per i dati di input in gruppi di 8 bit. La codifica è progettata in modo che il decodificatore possa determinare esattamente il numero di byte utilizzati nei dati originali. Tuttavia, questa granularità si estende solo ai gruppi di 8 bit e non si estende fino al livello di bit effettivo.

Un approccio potrebbe essere quello di codificare i dati con il primo byte che rappresenta il numero di bit, e quindi i seguenti byte che rappresentano gli stessi bit effettivi. Il tuo decodificatore potrebbe usare queste informazioni per estrarre il numero esatto di bit che hai originariamente conservato (con zeri iniziali o finali, se lo desideri).

    
risposta data 26.07.2012 - 02:25
fonte
1

Sia x che y mantengono valori interi, devi solo scegliere di usare 0b valori letterali binari per definirli.

Se vuoi combinare i due in z , puoi farlo facilmente utilizzando una operazione di spostamento e operazioni bit a bit binari :

>>> x = 0b00010101010
>>> y = 0b1110000
>>> z = (x << 7) | y
>>> bin(z)
'0b101010101110000'

Si noti che python non traccia quanti bit 'precisione' si desidera mantenere su tali valori; hai definito y con 7 bit di informazioni, quindi ho dovuto spostare x a sinistra 7 volte per fare spazio a y . Dovresti tenere traccia di queste informazioni da solo.

Il tuo prossimo problema è rappresentare i dati come base64 in quanto questo formato richiede di fornirli solo con i byte. Sono pezzi di 8 bit di dati binari. Ciò significa che dovrai allineare i tuoi bit ai limiti di 8 bit e quindi trasformarli in byte (ad esempio stringhe). Non potrò aggirare questo, temo.

Utilizzerei il % modulo distruct per questo, ti consente di comprimere interi e altri dati- digita in byte con facilità:

>>> import struct
>>> struct.pack('>H', x)
'\x00\xaa'
>>> struct.pack('>H', x).encode('base64')
'AKo=\n'

Nell'esempio precedente ho impacchettato la variabile x a 11 bit come un corto senza segno (usando il formato C standard little-endian), ottenendo 2 byte di informazioni, quindi codificato in base64.

Il contrario richiede quindi la decodifica da base64, quindi un'operazione di decompressione:

>>> foo = struct.unpack('>H', 'AKo=\n'.decode('base64'))[0]
>>> bin(foo)
'0b10101010'

Ancora una volta, Python non tiene traccia di quanti bit di informazioni sono importanti per te, dovrai tenerne traccia in modo esplicito.

    
risposta data 26.07.2012 - 09:50
fonte

Leggi altre domande sui tag