Название: Структуры и байты Отправлено: Anarion от Октябрь 29, 2010, 19:02 Доброго всем времени суток.
Извиняюсь, если вопрос не совсем относится к Qt, но может быть вы сможете сказать чего я не понимаю. В общем объявил структуру: Код: //Прагму использовал для упаковки. чтобы структура занимала 10 байт в соответствии с суммой всех полей. Без прагмы 12 байт. Далее в теле программы: Код: SNAC_HDR snac; //создаю объект структуры В результате в отладчике получаю следующее: Код: i [ 0 ] 4 Видно, что поля установлены правильно, и сами поля (судя по адресу) занимаю 2 байта. Но вот значения полей озадачивают (772 и 258). Не могу понять откуда они берутся. Если посмотреть внимательно, то можно вывести, что 772 (10) = 304 (16), а 258 (10) = 102 (16). Т.е. во-первых переставляются байты, во-вторых между ними появляется 0 и вообще получается, что значение полей определяется 3 битами, хотя по адресам их 2. Не пойму, куда копать. С одной стороны значения байтов правильные, с другой стороны значения самих полей, выводимые в qDebug() неправильные. Подскажите пожалуйста, где неправ. Заранее благодарен. Название: Re: Структуры и байты Отправлено: BlackTass от Октябрь 29, 2010, 20:12 Ну наверно начать надо с того, что все же у нас данные хранятся в двоичной системе и один байт это 8-значное двоичное число, либо 2-значное hex число. То есть все же 0x102 это два байта, а не три (0x01 и 0x02).
По поводу перестановки байт. Советую почитать в вики про big-endian и little-endian. Вопрос думаю сразу отпадет. Название: Re: Структуры и байты Отправлено: Igors от Октябрь 29, 2010, 20:39 Ну наверно начать надо с того, что все же у нас данные хранятся в двоичной системе и один байт это 8-значное двоичное число, либо 2-значное hex число. То есть все же 0x102 это два байта, а не три (0x01 и 0x02). Да все правильно, в байты лезть - получить по ушам с endian. Но так ли уж это очевидно и "само-собой"? Напр. будет ли корректно (однозначно) работать такое на обоих endian:По поводу перестановки байт. Советую почитать в вики про big-endian и little-endian. Вопрос думаю сразу отпадет. Код: double d = 3.14159; Название: Re: Структуры и байты Отправлено: Anarion от Октябрь 29, 2010, 21:22 Спасибо большое, ситуация вроде как начала прояснятся. Получается, что для правильного отображения мне сначала нужно поменять местами старший и младший байты, но для передачи по сети оставить как есть?
Название: Re: Структуры и байты Отправлено: developer от Октябрь 30, 2010, 13:17 Да
Название: Re: Структуры и байты Отправлено: BlackTass от Октябрь 30, 2010, 20:25 Да На x86 да, а, например, на Эльбрусах (которые SPARC) не нужно менять местами. |