Заполнение массива данными разной длины
От: prg1000  
Дата: 07.08.13 07:45
Оценка:
Привет.
Есть массив с 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;

Со вторым способом все понятно, а вот с первым не уверен, что будет работать везде и всегда. Может еще что-то предложите?
+разметка
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.