Как написать 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-битное значение.