Если вы работаете с архитектурой ПК x86, то нет проблем с выравниванием (кроме скорости), и вы можете преобразовать char *
в int *
, чтобы выполнить преобразования:
char data[20];
*((int *)data) = first_int;
*((int *)(data+sizeof(int))) = second_int;
и тот же синтаксис можно использовать для чтения из data
, просто поменяв местами =
.
Обратите внимание, однако, что этот код не переносим, потому что существуют архитектуры, в которых невыровненная операция может быть не просто медленной, ана самом деле незаконно (сбой).В этих случаях, вероятно, самый хороший подход (который также дает вам возможность управления порядком байтов в случае, если data
является частью протокола связи между различными системами) - это явное построение целых чисел в коде по одному символу за раз:
first_uint = ((unsigned char)data[0] |
((unsigned char)data[1] << 8) |
((unsigned char)data[2] << 16) |
((unsigned char)data[3] << 24));
data[4] = second_uint & 255;
data[5] = (second_uint >> 8) & 255;
data[6] = (second_uint >> 16) & 255;
data[7] = (second_uint >> 24) & 255;