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

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

  •  09-10-2019
  •  | 
  •  

Вопрос

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

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

(Так, если NUM0, NUM1, NUM2 и NUM3 являются отдельными байтами, составляющими NUM, сообщение будет кодировано как num2|num1|num0.)

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

Это было полезно?

Решение

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

Другие советы

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

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

*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-битное значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top