Привет.
Есть массив с 10-ю элементами типа unsigned char. Его нужно заполнить данными разной длины 1,4,2 байта. Т.е. идеально было бы иметь объединение типа
typedef union
{
struct
{
unsigned char d1;
int d2;
short d3;
short d4;
unsigned char d5;
} data;
unsigned char data_bytes[10];
} MY_UNION;
MY_UNION my_data;
но элементы в нем будут не выравнены и заполнить массив используя поля
не получится. Т.е. получится, но данные выйдут за границы 10 байт массива.
Решения:
1. Заполнить вот так:
my_data.data_bytes[0] = d1;
*(int*)&my_data.data_bytes[0] = d2;
*(short*)&my_data.data_bytes[0] = d3;
*(short*)&my_data.data_bytes[0] = d4;
my_data.data_bytes[0] = d5;
2. Заполнить поэлементно, используя операции сдвига:
my_data.data_bytes[0] = d1;
my_data.data_bytes[1] = d2 & 0xFF;
my_data.data_bytes[2] = (d2>>8) & 0xFF;
my_data.data_bytes[3] = (d2>>16) & 0xFF;
my_data.data_bytes[4] = (d2>>24) & 0xFF;
my_data.data_bytes[5] = d3 & 0xFF;
my_data.data_bytes[6] = (d3>>8) & 0xFF;
my_data.data_bytes[7] = d4 & 0xFF;
my_data.data_bytes[8] = (d4>>8) & 0xFF;
my_data.data_bytes[9] = d5;
Со вторым способом все понятно, а вот с первым не уверен, что будет работать везде и всегда. Может еще что-то предложите?
+разметка