Конвертировать QByteArray в quint16 - PullRequest
3 голосов
/ 11 октября 2010

У меня есть следующий макрос C из libpurple:

#define yahoo_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff))

Как я могу написать это как функцию, которая получит в качестве параметра QByteArray и перезапустит значение quint16, используя алгоритм в макросе c выше?

Я задал похожий вопрос, который преобразует из quint16 в QByteArray здесь , так что в основном то, что я пытаюсь сделать сейчас, - это обратная функция.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 12 октября 2010

Вы также можете использовать qFromBigEndian

QByteArray bytes;
...
quint16 result = qFromBigEndian<quint16>((uchar*)bytes.data());
3 голосов
/ 11 октября 2010

Я бы попробовал что-то вроде следующего (например, пусть QDataStream сделает за вас работу, которую можно создать с помощью QByteArray, назовем это yourByteArray):

QDataStream dataStream(yourByteArray);
quint16 foo;
dataStream >> foo;

Я надеюсьэто помогает.

РЕДАКТИРОВАТЬ: Этот вопрос выглядит несколько связанным.

2 голосов
/ 11 октября 2010

Код Грега S отлично работает для меня (Qt 4.6.2 и WinXP). Наименее значимые биты quint16 получены из QByteArray [1], а наиболее значимые биты - из QByteArray [0]. Но если вы хотите точно контролировать, как создается quint16, получите оба байта для байтового массива и создайте quint16 из них:

QDataStream dataStream(yourByteArray);
quint8 byte0;
quint8 byte1;
dataStream >> byte0 >> byte1;
quint16 result = (byte0 << 8) + byte1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...