Russian Qt Forum

Qt => Работа с сетью => Тема начата: User162 от Апрель 04, 2013, 15:00



Название: QTcpSocket и QDataStream помогите сериализовать
Отправлено: User162 от Апрель 04, 2013, 15:00
Всем привет!
Есть прога, которая шлёт данные по сети. Прогу, сразу скажу, писал не я. Моя задача принять эти данные и распарсить их.
Все что мне известно это структура данных, сама посылка.
Структура данных такова:
Код:
struct values
{
int a;
float         b;
float         c;
int         d;
int e;
}

Каждое значение - 4 байта. Там и дробные и отрицательные числа.

Вот фрагмент посылки:
Код:
Data= "5000000031743c426a17353f04000000f2ffffff" 
Data= "2900000008239c414cffd83e030000005dffffff"
Data= "390000004816fc41a1a8693ff5ffffff17000000"
Data= "510000005d688641a632393f1e000000a4000000"
Data= "19000000257db240b63c413f1d000000a2ffffff"
Data= "1f000000db643142795b3c3f0c000000a4000000"

Data= "12000000 8965dc41 1ec65b3f f6ffffff 6c000000"

Можно попробовать разбирать полученный массив на байты. Но нет ли более изящного варианта.
Да, кстати там используется обратный порядок байт.

Код:
void MainWindow::slotReadClient()
{
    QTcpSocket* ClientSocket = (QTcpSocket*)sender();
//    qDebug() << "Data=" << ClientSocket->readAll().toHex();
    int w;
    quint16 data_size = 0;
    QDataStream in(ClientSocket);
    in.setByteOrder(QDataStream::LittleEndian);
    in.readRawData(ClientSocket->readAll().data(), sizeof(ClientSocket->readAll().data()));
    in >> w;
    qDebug()<<"w=" <<w;
//????? help!!!


Название: Re: QTcpSocket и QDataStream помогите сериализовать
Отправлено: Bepec от Апрель 04, 2013, 15:22
Эмм... а что мешает тупо наложить структуру на байты? reinterpret_cast'ом?


Название: Re: QTcpSocket и QDataStream помогите сериализовать
Отправлено: User162 от Апрель 04, 2013, 15:24
А мне бы примерчик, как это сделать)))...если можно


Название: Re: QTcpSocket и QDataStream помогите сериализовать
Отправлено: RedDog от Апрель 04, 2013, 15:59
Эмм... а что мешает тупо наложить структуру на байты? reinterpret_cast'ом?
А если она на той стороне выровнена как нидь хитро?


Название: Re: QTcpSocket и QDataStream помогите сериализовать
Отправлено: Bepec от Апрель 04, 2013, 16:44
А это уже надо смотреть и ровнять :D  Как грится надо надеяться и верить :D

Код:
values * struct;
struct = reinterpret_cast<values*>(data.data());

Ну как то так :D



Название: Re: QTcpSocket и QDataStream помогите сериализовать
Отправлено: Странник от Апрель 06, 2013, 23:39
нет, нет и еще раз нет. лучше сериализовать и десериализовать полями. особенно, если порядок байт отличается от порядка байт на вашей платформе.
для объявления четырехбайтного целого лучше использовать предопределенный тип qint32, чтобы гарантировать длину на любой из целевых платформ.
установка QDataStream порядка байт LittleEndian не имеет смысла, если вы не читаете многобайтные типы данных, так что читайте из устройства полями.