Come scrivere un messaggio a 24 bit dopo la lettura da un intero di 4 byte su una macchina grande endian (C)?
-
09-10-2019 - |
Domanda
sto costruendo un messaggio da inviare un numero a 24 bit sulla rete. Per piccole macchine endian, il codice è (PTR è il puntatore al buffer dei messaggi):
*ptr++ = (num >> 16) & 0xFF;
*ptr++ = (num >> 8) & 0xFF;
*ptr++ = (num) & 0xFF;
(Quindi, se NUM0, num1, num2 e num3 sono i singoli byte che compongono num, il messaggio sarebbe stato codificato come num2|num1|num0
.)
Quale dovrebbe essere il codice per la codifica num2|num1|num0
su una grande macchina endian?
Soluzione
Il tuo codice è portatile indipendentemente endianess. Gli operatori di spostamento >>
lavoro <<
con i valori, non con la rappresentazione.
Altri suggerimenti
La questione è, in quale ordine di byte è il Messaggio essere inviati / costruiti? Perché se siete su un piccolo o grande macchina endian non importa per quanto riguarda num
, come si sta già dividendo num
in singoli byte in modo endian-agnostico.
Il codice che hai postato negozi 24 bit di num
a big endian (aka ordine di byte di rete). Quindi, se è questo che si vuole si sta già fatto. Se si desidera memorizzare in grande po ', invece, basta invertire l'ordine:
*ptr++ = (num) & 0xFF;
*ptr++ = (num >> 8) & 0xFF;
*ptr++ = (num >> 16) & 0xFF;
Nella macchina di ricezione, indipendentemente dal endian-ness, se li riceve in stesso ordine in cui sono memorizzati in PTR, assemblarli in questo modo:
num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]);
int main(int argc, char** argv) {
int a, b;
a = 0x0f000000; // Contain 32 bit value
printf("before = %d\n", a);
b = a & (~0xff000000); // convert the last 8 bits to zero so we got only 24 bit value in b
printf("After = %d\n", b);
return (EXIT_SUCCESS);
}
C'è un numero contenente un valore di 32 bit, ma il numero b contiene solo 24 bit, a partire dalla cifra meno significativa. E questo non dipende da endianness perché operatori bit per bit non funzionano con la rappresentazione della memoria.
Quindi, è possibile utilizzare
num = num & (~0xff000000);
per ottenere l'ultimo valore a 24 bit.