Come scrivere un messaggio a 24 bit dopo la lettura da un intero di 4 byte su una macchina grande endian (C)?

StackOverflow https://stackoverflow.com/questions/3965873

  •  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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top