Доброго всем времени суток.
Извиняюсь, если вопрос не совсем относится к Qt, но может быть вы сможете сказать чего я не понимаю.
В общем объявил структуру:
//Прагму использовал для упаковки. чтобы структура занимала 10 байт в соответствии с суммой всех полей. Без прагмы 12 байт.
#pragma pack(push, 1)
struct SNAC_HDR
{
unsigned short int FamilyID;
unsigned short int SubTypeID;
unsigned short int Flags;
//unsigned char Flags[2];
unsigned long int RequestID;
};
#pragma pack(pop)
Далее в теле программы:
SNAC_HDR snac; //создаю объект структуры
unsigned char b[4] = {4,3,2,1}; //создаю массив символов
memset(&snac,0,4); //устанавливаю в 0 первые 4 байта структуры
memcpy(&snac,&b,4); //заполняю их из массива
unsigned char d[4]; //объявляю еще один массив символов
memcpy(&d,&snac,4); //копирую из адреса структуры в новый массив
//вывожу посимвольно для проверки, должно быть 4 3 2 1
for (int i=0; i<4; i++)
{
qDebug() << " i [" << i << "] " << d[i];
}
qDebug() << "0" << &snac << &snac.FamilyID << &snac.SubTypeID << &snac.Flags; //вывожу адреса полей для проверки занимаемых байт
qDebug() << "1" << snac.FamilyID << snac.SubTypeID; //вывожу поля "как есть" в отладчике
qDebug() << "2" << (unsigned short int)snac.FamilyID << (unsigned short int)snac.SubTypeID; //то же с преобразованием к типу полей
qDebug() << "3" << (unsigned char)snac.FamilyID << (unsigned char)snac.SubTypeID; //то же с преобразованием к символьному типу
В результате в отладчике получаю следующее:
i [ 0 ] 4
i [ 1 ] 3
i [ 2 ] 2
i [ 3 ] 1
0 0x22c7b6 0x22c7b6 0x22c7b8 0x22c7ba
1 772 258
2 772 258
3 4 2
Видно, что поля установлены правильно, и сами поля (судя по адресу) занимаю 2 байта. Но вот значения полей озадачивают (772 и 258).
Не могу понять откуда они берутся. Если посмотреть внимательно, то можно вывести, что 772 (10) = 304 (16), а 258 (10) = 102 (16).
Т.е. во-первых переставляются байты, во-вторых между ними появляется 0 и вообще получается, что значение полей определяется 3 битами, хотя по адресам их 2. Не пойму, куда копать. С одной стороны значения байтов правильные, с другой стороны значения самих полей, выводимые в qDebug() неправильные.
Подскажите пожалуйста, где неправ. Заранее благодарен.