Contenuti
- 1. Utilizzo del modulo struct. Dati binari impacchettati
- 2. I metodi di base del modulo struct
- 2.1. I metodi pack() e unpack(). Impacchettare e disimballare i dati
- 2.2. Metodo calcsize(). La dimensione dell’oggetto impacchettato
- 3. Stringhe formattate
- 3.1. Impostare l’ordine dei byte, la dimensione e l’allineamento in base al carattere di formato
- 3.2. Esempi di stringhe formattate per diversi tipi di dati
- Argomenti correlati
Cerca altri siti web:
1. Utilizzo del modulo struct. Dati binari impacchettati
Il modulo struct di Python è usato per creare ed estrarre dati binari impacchettati da stringhe. Nel modulo struct, i byte di dati sono interpretati come dati binari impacchettati che possono essere rappresentati da oggetti di tipo byte o bytearray.
Il modulo contiene strumenti di conversione tra valori Python e strutture C, che sono rappresentate come oggetti byte Python. Tali conversioni sono utilizzate nell’elaborazione di dati binari memorizzati in file o ottenuti da connessioni di rete, ecc.
Per fornire una descrizione compatta delle strutture C e la conversione in valori (da valori) di Python, vengono usate stringhe di formato.
⇑
2. I metodi di base del modulo struct
Il modulo struct contiene diversi metodi di base che potete usare per impacchettare e scompattare i dati.
2.1. I metodi pack() e unpack(). Impacchettare e disimballare i dati
Per impacchettare e disimballare i dati si usano i metodi pack(), unpack(). Il processo di impacchettamento/disimballaggio è implementato secondo la stringa di formato.
Secondo la documentazione, la forma generale di utilizzo del metodo pack() è la seguente
obj = struct.pack(format, v1, v2, ...)
where
- format – stringa di formato. Questa stringa è formata secondo le regole stabilite nelle tabelle (vedi paragrafo 3);
- v1, v2, … – valori (oggetti) da impacchettare;
- obj – oggetto binario impacchettato.
La funzione unpack() esegue l’inverso dell’operazione pack(). Permette di ottenere l’oggetto sorgente sulla base dell’oggetto impacchettato. La forma generale di utilizzo della funzione è la seguente:
obj = struct.unpack(format, buffer)
qui
- buffer – un buffer in cui viene scritto un oggetto precedentemente impacchettato dalla funzione pack(). La dimensione di questo oggetto deve corrispondere alla dimensione specificata in format;
- format – una stringa di formato in base alla quale si ottiene un oggetto binario spacchettato obj;
- obj – l’oggetto risultante, che può essere una lista, una tupla, un insieme, un dizionario, ecc.
Quando si chiama la funzione unpack(), la stringa di formato deve corrispondere alla stessa stringa specificata dalla funzione pack().
esempio. A scopo dimostrativo, viene effettuato il pack/unpacking della lista di numeri.
# Module struct. Methods pack(), unpack()# Pack/unpack list of numbers# 1. Specified list of numbersLS = # 2. Include module structimport struct# 3. Pack list of numbers. Method pack()pack_obj = struct.pack('>4і', LS, LS, LS, LS)# 4. Display the object pack_objprint('pack_obj = ', pack_obj)# 5. Unpack list of numbers. Method unpack().# The result is a tuple T2T2 = struct.unpack('>4і', pack_obj) # T2 = (1, 3, 9, 12)# 6. Print the unpacked object T2print('T2 = ', T2)# 7. Convert tuple T2 to list LS2LS2 = list(T2) # LS2 = # 8. Display the list LS2print('LS2 = ', LS2)
il risultato del programma
pack_obj = b'\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\t\x00\x00\x00\x0c'T2 = (1, 3, 9, 12)LS2 =
⇑
2.2. Metodo calcsize(). La dimensione dell’oggetto impacchettato
Il metodo calcsize() restituisce la dimensione dell’oggetto creato dal metodo pack().
Esempio.
# Module struct.# Method calcsize(). Determine the size of the packed object# 1. Include module structimport struct# 2. Determine the size of a packed list of numbers# 2.1. Specified list of floating point numbersLS = # 2.2. Pack list LS. Method pack()pack_obj = struct.pack('>3f', LS, LS, LS)# 2.3. Display the packed object pack_objprint('pack_obj = ', pack_obj)# 2.4. Display the size of pack_objsize = struct.calcsize('>3f') # size = 12print('size = ', size)# 3. Determine the size of a packed tuple of strings# 3.1. The specified tuple of two stringsTS = ( 'Hello', 'abcd')# 3.2. Pack the tuple TSpack_obj = struct.pack('<5s4s', TS.encode(), TS.encode())# 3.3. Display the packed objectprint('pack_obj = ', pack_obj)# 3.4. Display the size of packed tuplesize = struct.calcsize('<5s4s') # size = 9print('size = ', size)
Il risultato del programma
pack_obj = b'@8Q\xec@y\x99\x9a\xc1(\x00\x00'size = 12pack_obj = b'Helloabcd'size = 9
⇑
3. Stringhe formattate
3.1. Impostare l’ordine dei byte, la dimensione e l’allineamento in base al carattere di formato
In Python, il modo in cui una stringa è impacchettata è determinato in base al primo carattere della stringa di formato. Questo simbolo definisce:
- l’ordine dei byte, che è formato usando i caratteri @, =, <>, !. Se questo parametro non è specificato, il simbolo @ è accettato;
- la dimensione in byte dei dati confezionati. In questo caso, i numeri che indicano il numero sono usati per primi;
- allineamento, che è impostato dal sistema.
Secondo la documentazione Python nella stringa di formato, l’ordine dei byte, la dimensione e l’allineamento sono formati secondo il primo carattere del formato. I possibili primi caratteri del formato sono mostrati nella tabella seguente.
Carattere | Ordine dei byte | Dimensione | Allineamento |
@ | nativo (dipendente dall’host) | Nativo | Nativo |
= | nativo | standard | nessuno |
< | little-endian | standard | nessuno |
> | big-endian | standard | nessuno |
! | network (= big-endian) | standard | nessuno |
Un valore di ordine di byte può essere uno dei 4:
- ordine nativo. Questo ordine può essere sia little-endian che big-endian. Questo ordine è determinato dal sistema host;
- ordine di tipo little-endian. In questo ordine, il byte basso viene processato per primo, e poi il byte alto;
- ordine di tipo big-endian. In questo caso, viene processato prima il byte alto, e poi il byte basso;
- ordine di rete, che per default è di tipo big-endian.
La dimensione dei dati impacchettati può essere una delle due cose:
- nativa – definita usando le istruzioni del compilatore C sizeof;
- standard – è determinata in base al carattere di formato secondo la tabella sottostante.
Tabella. Definizione della dimensione standard dei dati impacchettati in base al carattere di formato
Formato | Tipo C | Python Tipo | Dimensione standard |
x | pad byte | nessun valore | |
c | carattere | bytes di lunghezza 1 | 1 |
b | signed char | intero | 1 |
B | carattere non firmato char | intero | 1 |
? | _Bool | bool | 1 |
h | short | integrale | 2 |
H | non firmato short | intero | 2 |
i | int | intero | 4 |
I | int non firmato | intero | 4 |
l | lungo | intero | 4 |
L | unsigned long | integrale | 4 |
q | long long | integer | 8 |
Q | unsigned long long | integrale | 8 |
n | ssize_t | integrale | |
N | size_t | integrale | |
e | float (formato esponenziale) | float | 2 |
f | float | float | 4 |
d | doppio | float | 8 |
s | char | bytes | |
p | carattere | bytes | |
P | void* | intero |
⇑
3.2. Esempi di stringhe formattate per diversi tipi di dati
.