pack
e unpack
sono funzioni all'interno di perl che possono eseguire alcune trasformazioni di dati.
La parte più interna di questo è (b7)*
- e sei corretto che questa è una stringa di bit. Tuttavia, prende solo 7 bit alla volta:
Da: link
the b and B formats pack a string that's that many bits long. Each such format generates 1 bit of the result. These are typically followed by a repeat count like B8
or B64
.
Stai prendendo una stringa lunga 8 bit, taglia il bit più alto e lo riscrivo come blocchi di dati a 8 bit.
Starting from the beginning of the input string, each 8-tuple of characters is converted to 1 character of output. With format b , the first character of the 8-tuple determines the least-significant bit of a character; with format B , it determines the most-significant bit of a character.
If the length of the input string is not evenly divisible by 8, the remainder is packed as if the input string were padded by null characters at the end. Similarly during unpacking, "extra" bits are ignored.
Per questo, dovresti prendere qualcosa che è probabilmente ASCII o dati a 7 bit simili che ha sempre il suo bit più alto di 0, rimuovendo il bit più a sinistra (vedi sotto), e riscrivendolo come un flusso costante di dati ( piuttosto che ogni 8 bit essendo 0).
La chiave è che legge 8 bit alla volta con b
e ne usa solo 7.
Da notare, c'è un po 'di' huh 'in corso in questo codice da come si guardano tipicamente dati e numeri. Il b
sta leggendo i dati little endian. Ciò significa che il bit più a sinistra è quello che viene rimosso.
Consente di prendere la stringa az
e decomprimerla con b7
. Il risultato è 1000011 0101111
(ho messo uno spazio lì in modo che potessi leggerlo più facilmente e separare i bit).
'a' in binario è 01100001
e 'z' è 01111010
come grande indiano. Nota che il bit più a sinistra è 0
.
unpack('(b7)*','az')
lo leggerà little endian (al contrario di quello che si pensa di solito) e rilascia il bit meno significativo (little endian) che è quello più a sinistra.
Ora che il bit sempre più a sinistra di alcuni (probabilmente) ascii è scomparso, l'intera cosa viene riscritta di nuovo.
0110000101111010
^! ^!
diventa
11000011111010
! !
( ^
e !
mostrano punti equivalenti tra le righe)