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