Russian Qt Forum
Октябрь 01, 2024, 12:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTcpSocket и QDataStream помогите сериализовать  (Прочитано 4129 раз)
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!!!
Записан
Bepec
Гость
« Ответ #1 : Апрель 04, 2013, 15:22 »

Эмм... а что мешает тупо наложить структуру на байты? reinterpret_cast'ом?
Записан
User162
Гость
« Ответ #2 : Апрель 04, 2013, 15:24 »

А мне бы примерчик, как это сделать)))...если можно
Записан
RedDog
Гость
« Ответ #3 : Апрель 04, 2013, 15:59 »

Эмм... а что мешает тупо наложить структуру на байты? reinterpret_cast'ом?
А если она на той стороне выровнена как нидь хитро?
Записан
Bepec
Гость
« Ответ #4 : Апрель 04, 2013, 16:44 »

А это уже надо смотреть и ровнять Веселый  Как грится надо надеяться и верить Веселый

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

Ну как то так Веселый

Записан
Странник
Гость
« Ответ #5 : Апрель 06, 2013, 23:39 »

нет, нет и еще раз нет. лучше сериализовать и десериализовать полями. особенно, если порядок байт отличается от порядка байт на вашей платформе.
для объявления четырехбайтного целого лучше использовать предопределенный тип qint32, чтобы гарантировать длину на любой из целевых платформ.
установка QDataStream порядка байт LittleEndian не имеет смысла, если вы не читаете многобайтные типы данных, так что читайте из устройства полями.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.042 секунд. Запросов: 20.