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

Я создаю сообщение для отправки 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 ]

3 голосов
/ 19 октября 2010

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

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

*ptr++ = (num)       & 0xFF;
*ptr++ = (num >> 8)  & 0xFF;
*ptr++ = (num >> 16) & 0xFF;
1 голос
/ 19 октября 2010

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

0 голосов
/ 19 октября 2010
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 голосов
/ 19 октября 2010

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

num = (ptr[0] << 16) + (ptr[1] << 8) + (ptr[2]);
...