Как написать 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 на большой конечной машине?

2
задан Bikash 19 окт. '10 в 9:36
источник поделиться

4 ответов

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

1
ответ дан Secure 19 окт. '10 в 10:13
источник поделиться

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

Код, который вы отправили, хранит 24 бита num в формате big endian (aka network byte order). Поэтому, если вы этого хотите, вы уже сделали. Если вы хотите сохранить его в большом размере, просто измените порядок:

*ptr++ = (num)       & 0xFF;
*ptr++ = (num >> 8)  & 0xFF;
*ptr++ = (num >> 16) & 0xFF;
3
ответ дан DarkDust 19 окт. '10 в 9:49
источник поделиться
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-битное значение.

0
ответ дан Anand Kumar 19 окт. '10 в 12:17
источник поделиться

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

num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]);
0
ответ дан Prof. Falken 19 окт. '10 в 11:07
источник поделиться

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