преобразовать 32-битную переменную в порядке с прямым порядком байтов в Little Endian

0

Мой сервер получает 6 байтов данных: 2 байта головы и 1 переменная состоят из последних 4 байтов в порядке Большого Эндиана (в примере ниже переменная равна 100000 десятичных)

  00000001 head
  00000001
  10100000 start  4 bytes of variable (100000 decimal)
  10000110
  00000001
  00000000

Я хочу прочитать эту переменную, используя этот код ниже (buf содержит данные выше)

 unsigned char buf[MAX_s]; 
 int32_t var = (buf[2] << 24) | (buf[3] << 16) | (buf[4] << 8) | buf[5];
 printf("  %u \n",var);

но ожидаемый результат не 100000, а некоторое другое большее число. Что я делаю неправильно?

Теги:

1 ответ

1
Лучший ответ

Вы отправили 6 байтов, преобразованных в шестнадцатеричные, следующие:

01 01 A0 86 01 00

Если вы определяете байты 2-5 как большой аргумент, объединенное число равно 0xA0860100 = 2693136640. Это номер, который вы получили?

100000 = 0x000186a0. Если вы ожидали, что число будет равным 100000, похоже, что ваш байтовый поток содержит незначительные данные по endian, а не большой endian. Переверните преобразователь, чтобы исправить это:

int32_t var = (buf[5] << 24) | (buf[4] << 16) | (buf[3] << 8) | buf[2];
  • 0
    да именно этот номер!
  • 0
    это работает сейчас, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню