Я пытаюсь преобразовать 2-байтовый массив в одно 16-битное значение. По какой-то причине, когда я передавал массив как 16-разрядный указатель и затем разыменовывал его, порядок байтов значения менялся местами.Кастинг uint8_t массив в значение uint16_t в C
Например,
#include <stdint.h>
#include <stdio.h>
main()
{
uint8_t a[2] = {0x15, 0xaa};
uint16_t b = *(uint16_t*)a;
printf("%x\n", (unsigned int)b);
return 0;
}
печатает aa15
вместо 15aa
(что я бы ожидать).
В чем причина этого, и есть ли легкое решение?
Мне известно, что я могу сделать что-то вроде uint16_t b = a[0] << 8 | a[1];
(это работает очень хорошо), но я чувствую, что эта проблема должна быть легко разрешена с помощью кастинга, и я не уверен, что вызывает здесь проблему.
Это из-за [endianness] (https://en.wikipedia.org/wiki/Endianness). Вы не решите его, выполнив кастинг: ваш shift-and-add (или) хорош. –
http://stackoverflow.com/questions/22030657/little-endian-vs-big-endian – fukanchik