LINUX.ORG.RU

Qt: порядок байтов


0

1

я уже замучался в этими остроконечнотупоконечными видами представлений

у меня есть датаграмма полученная по UDP протоколу в виде последовательности байтов, от которой надо отобрать последние 4, перевернуть их перевести в интежер и радоваться жизни.

ну так вот, я откусываю последние 4 байта, пытаюсь перевернуть и оцелочислить, но в переменной оказывается 0.

//было что то вроде ЯЯЯЯяЯFFFFFFFF4E0AABCDEF01 //нужно взять ABCDEF01 //превратить в 01EFCDAB //и записать в виде интежера 32492971

if (datagram.contains(QByteArray::fromHex(«FFFFFFFF4E0A»))) {

printf(«datagram part:\n»); int challenge = qFromBigEndian<int>(datagram.right(4).toHex().toInt()); printf(«%i», challenge); printf(«\n»);

}

}

}

как я только не пытался и просто в инт и через хекс и через raw data. причем если вывести байты datagram.right(4).toHex() то видно что байты я взял правильно.

Ответ на: комментарий от arsi

у меня не qdatastream а qbytearray а qbytearray ничего от оного не наследует, так что объясните поподробнее что я должен был там увидеть

preepunk
() автор топика

Функции toHex и toInt используются для работы с текстовым представлением чисел. Можно сделать так:

char x[]={0,0,0,0xAB,0x91,0x12,0xFF};
QByteArray ba(x,sizeof(x));
//...
int challenge;
ba=ba.right(sizeof(challenge));
char const *xx=ba.data();
memcpy(&challenge,xx,sizeof(challenge));
printf("%X\n",qFromBigEndian(challenge));
staseg ★★★★★
()

Мрак.

union
{
  int32_t i32;
  char bytes[sizeof(i32)];
} char2int32;
memcpy(char2int32.bytes, datagram.data()+datagram.size()-sizeof(char2int32), sizeof(char2int32));
int32_t i = ntohl(char2int32.i32);
legolegs ★★★★★
()

Жуть!

Наверно, хотелось чего-то такого:

qFromBigEndian<qint32>((uchar*)QByteArray::fromHex("FFFFFFFF4E0A").right(4).data())

unC0Rr ★★★★★
()

Qt: порядок байтов

я уже замучался в этими остроконечнотупоконечными видами представлений

Тащемта в Qt довольно давно есть функции, которые это преобразование делают автоматически. http://doc.qt.nokia.com/latest/qtendian.html

slackwarrior ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.