Мой вопрос в том, как вы преобразовываете значение UINT32 в массив UINT8 [4] (C/С++), предпочтительно, независимо от его сущности? Кроме того, как бы вы восстановили значение UINT32 из массива UINT8 [4], чтобы вернуться туда, где вы начали?
Преобразование значения UINT32 в массив UINT8 [4]
Ответ 1
Вы на самом деле не сказали, что вы подразумеваете под независимостью от endianness - это неясно, так как массив байтов должен иметь некоторую определенность. При этом один из нижеперечисленных требований должен отвечать вашим требованиям:
Учитывая UINT32 v
и UINT8 a[4]
:
"Host" endian
(используйте порядковый порядок байтов машины):
UINT8 *vp = (UINT8 *)&v;
a[0] = vp[0];
a[1] = vp[1];
a[2] = vp[2];
a[3] = vp[3];
или
memcpy(a, &v, sizeof(v));
или
*(UINT32 *)a = v;
Большой конец
(aka "порядок сети" ):
a[0] = v >> 24;
a[1] = v >> 16;
a[2] = v >> 8;
a[3] = v;
Маленький конец
a[0] = v;
a[1] = v >> 8;
a[2] = v >> 16;
a[3] = v >> 24;
Ответ 2
например. например:
UINT32 value;
UINT8 result[4];
result[0] = (value & 0x000000ff);
result[1] = (value & 0x0000ff00) >> 8;
result[2] = (value & 0x00ff0000) >> 16;
result[3] = (value & 0xff000000) >> 24;
Изменить: добавлена скобка (похоже, имеет более высокий приоритет, чем &)
Ответ 3
Если вы не хотите самостоятельно его кодировать, вы можете использовать функцию библиотеки C htonl() для преобразования 32-битного int к порядку байта сети. Существует также функция ntohl(), чтобы преобразовать их в порядок хоста.
Как только они находятся в сетевом порядке байтов, это просто вопрос доступа к int/long в виде байтового массива.
В целом, это, вероятно, самый портативный и проверенный способ достижения вашей цели.
Ответ 4
Можно также сделать это с помощью указателей. (Это мало, но если вы используете тот же метод реконструкции, это не имеет значения)
uint32 in = 0x12345678;
uint8 out[4];
*(uint32*)&out = in;
Это присваивает значение uint32 4 байтам после адреса памяти uint8, делая именно то, что вам нужно.
Чтобы перейти в другую сторону:
uint8 in[4] = {0x78, 0x56, 0x34, 0x12};
uint32 out;
out = *(uint32*)&in
Ответ 5
используйте Союз, состоящий из массива с 4-мя моментами uint8 и uint32.
Таким образом, он сортируется автоматически с помощью встроенного указателя Magic (массивы являются указателями на начало массива)