Cómo escribir un mensaje de 24 bits después de la lectura de un número entero de 4 bytes en una máquina big endian (C)?

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

  •  09-10-2019
  •  | 
  •  

Pregunta

Estoy construyendo un mensaje para enviar un número de 24 bits en la red. Para pequeñas máquinas endian, el código es (PTR es el puntero a la memoria intermedia de mensajes):

*ptr++ = (num >> 16) & 0xFF;
*ptr++ = (num >> 8)  & 0xFF;
*ptr++ = (num)       & 0xFF;

(Así que si NUM0, num1, num2 y num3 son los bytes individuales que componen num, el mensaje se codifica como num2|num1|num0.)

¿Cuál debe ser el código para codificar num2|num1|num0 en una máquina endian grande?

¿Fue útil?

Solución

Su código es portátil independientemente de endianess. Los operadores de desplazamiento >> trabajo << con los valores, no con la representación.

Otros consejos

La pregunta aquí es, ¿en qué orden byte mensaje se enviará / construidos? Porque si usted está en una pequeña o gran máquina endian no importa con respecto al num, como ya está dividiendo num en bytes individuales de un modo endian-agnóstico.

El código que has enviado tiendas de 24 bits de num en big endian (también conocido como el orden de bytes de red). Así que si eso es lo que quiere usted ya haya terminado. Si desea almacenarlo en pequeño gran lugar, simplemente invertir el orden:

*ptr++ = (num)       & 0xFF;
*ptr++ = (num >> 8)  & 0xFF;
*ptr++ = (num >> 16) & 0xFF;

En la máquina receptora, independientemente de endian-dad, si los recibe en el mismo orden en que se almacenan en el PTR, montar ellos de esta manera:

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);
}

Hay un número que contiene un valor de 32 bits, pero el número B contiene sólo 24 bits, a partir de menos dígitos significativos. Y que no depende de endianness porque los operadores bit a bit no trabajo con representación de memoria.

Así que usted puede utilizar

num = num & (~0xff000000);

para obtener el último valor de 24 bits.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top