// TOOL

Data Format Inspector

Incolla una sequenza di byte in esadecimale e leggila contemporaneamente come intero (8/16/32/64 bit, con e senza segno) e come float IEEE-754 single/double, in big e little endian. Per i float, la decomposizione di segno, esponente e mantissa; in più il percorso inverso, da valore a byte.

Ispettore formati dati ed endianness

1 · Byte grezzi

Separatori liberi (spazi, virgole, due punti, trattini) e prefissi 0x sono ignorati. L’offset sceglie il primo byte da interpretare.

2 · Inverso: valore → byte

Interpretazioni

Tipo Big-endian Little-endian
int8 — —
uint8 — —
int16 — —
uint16 — —
int32 — —
uint32 — —
int64 — —
uint64 — —
float32 — —
float64 — —

Decomposizione IEEE-754

Come funziona

Cos’è l’endianness (big e little)?

Gli stessi byte in memoria rappresentano numeri diversi a seconda dell’ordine in cui li si legge. In big-endian il byte più significativo viene per primo, in little-endian per ultimo: la sequenza 0x01 0x00 vale 256 in big-endian e 1 in little-endian. Le architetture x86/ARM sono little-endian; molti protocolli di rete e formati binari usano il big-endian (network byte order).

Gli stessi byte in memoria rappresentano numeri diversi a seconda dell’ordine in cui li si legge. In big-endian il byte più significativo viene per primo (l’ordine in cui scriviamo le cifre), in little-endian per ultimo. La sequenza 0x01 0x00 vale 256 in big-endian e 1 in little-endian: stesso buffer, due interi. Le architetture x86/ARM in pratica sono little-endian; molti protocolli di rete e formati binari usano il big-endian (network byte order).

Come funzionano gli interi con segno?

Gli interi con segno usano il complemento a due: il bit più significativo ha peso negativo e il negativo di un numero si ottiene invertendo tutti i bit e sommando 1. La forma senza segno legge gli stessi N bit come un intero non negativo in [0, 2ᴺ−1]: per questo 0xFF vale −1 come int8 ma 255 come uint8.

Gli interi con segno usano il complemento a due: il bit più significativo ha peso negativo. Per un valore a N bit:

Il negativo di un numero si ottiene invertendo tutti i bit e sommando 1. La forma senza segno legge gli stessi N bit come un intero non negativo in [0, 2ᴺ−1]: ecco perché 0xFF è −1 come int8 ma 255 come uint8.

Come sono codificati i float IEEE-754?

I float seguono lo standard IEEE-754: un bit di segno, un esponente memorizzato con un bias (127 per il single a 32 bit, 1023 per il double a 64 bit) e una mantissa. Il single ha 1 + 8 + 23 bit, il double 1 + 11 + 52. La mantissa ha un 1 implicito per i numeri normali; l’esponente tutto a 0 codifica zero e subnormali, tutto a 1 infinito e NaN.

I float seguono lo standard IEEE-754. Un valore è codificato in tre campi: un bit di segno s, un esponente e memorizzato con un bias (127 per il single a 32 bit, 1023 per il double a 64 bit) e una mantissa m. Per i valori normali:

Il single a 32 bit ha 1 bit di segno, 8 di esponente e 23 di mantissa; il double a 64 bit ha 1 + 11 + 52. La mantissa ha un 1 implicito davanti (il "bit nascosto") per i numeri normali. I casi limite dell’esponente codificano lo zero e i subnormali (esponente tutto a 0) e infinito/NaN (esponente tutto a 1).

Quando serve questo strumento?

Leggere un registro a 16 o 32 bit da un datasheet, decodificare un frame di un protocollo binario (Modbus, CAN, un payload UDP), capire perché un float salvato da una scheda arriva "scambiato" sul PC: in tutti questi casi contano l’ordine dei byte e la codifica. Vedere tutte le interpretazioni in parallelo rende immediato riconoscere quale tipo ed endian corrisponde al valore atteso.

Leggere un registro a 16 o 32 bit da un datasheet, decodificare un frame di un protocollo binario (Modbus, CAN, un payload UDP), capire perché un valore float salvato da una scheda arriva "scambiato" sul PC: in tutti questi casi conta sapere l’ordine dei byte e la codifica. Vedere tutte le interpretazioni in parallelo rende immediato riconoscere quale tipo ed endian corrisponde al valore atteso.

Approfondisci: wiki formati dati ed endianness →