Как написать 24-битное сообщение после чтения из 4-байтового целого числа на машине с прямым порядком байтов (C)?

Я создаю сообщение для отправки 24-битного числа по сети. Для машин с прямым порядком байтов этот код (ptr - указатель на буфер сообщений):

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

(Таким образом, если num0, num1, num2 и num3 являются отдельными байтами, составляющими num, сообщение будет закодировано как num2|num1|num0.)

Каким должен быть код для кодирования num2|num1|num0 на большой байтовой машине?

4 ответа

Решение

Ваш код переносим независимо от порядка байтов. Операторы сдвига >><< работать со значениями, а не с представлением.

Вопрос в том, в каком порядке байтов должно быть отправлено / создано сообщение? Потому что, находитесь ли вы на маленькой или большой машине с прямым порядком байтов, не имеет значения, num, как ты уже делишь num в отдельные байты в порядке байтов.

Код, который вы разместили, хранит 24 бита num с прямым порядком байтов (так называемый сетевой порядок байтов). Так что, если вы этого хотите, вы уже сделали. Если вы хотите хранить его в большом маленьком, просто измените порядок:

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

На принимающей машине, независимо от порядкового номера, если вы получаете их в том же порядке, в котором они хранятся в ptr, соберите их так:

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

Существует число, содержащее 32-битное значение, но число b содержит только 24 бита, начиная с наименее значащей цифры. И это не зависит от порядка байтов, потому что побитовые операторы не работают с представлением в памяти.

Так что вы можете использовать

num = num & (~0xff000000);

чтобы получить последнее 24-битное значение.

Другие вопросы по тегам