2014-03-18 8 views
3

У меня есть массив double:Преобразовать из QByteArray в массив двойных

QVector<double> Y(count); 

Мне нужно упаковать его QByteArray отправить через Ethernet.

Так что я сделал это. Это было не слишком трудно:

QByteArray line; 
line.clear(); 
line.append(QByteArray::fromRawData(reinterpret_cast<const char*>(Y.data()), 
count*sizeof(double))); 

Я пытаюсь использовать этот код для распаковки данных из QByteArray recv:

QVector<double> data((line.size())/sizeof(double)); 
QByteArray dou(sizeof(double),0x0); 
for(int i = 0; i<data.count(); i++){ 
    dou = recv.mid(i*sizeof(double),sizeof(double)); 
    data[i] = *reinterpret_cast<const double*>(dou.data()); 
    dou.clear(); 
} 

Но мне не нравится это. Я хочу найти элегантный способ распаковать с QByteArray до QVector<double> Вы можете мне помочь?

+0

Примечание: это не просто не изящно, но и хрупко и не переносит. –

ответ

5

вы можете использовать QDataStream, который будет кодировать данные в двоичном виде в a specific format. (более конкретно первое число элементов (Int32), а затем каждый пункт)

QVector имеет overloads for the stream operators

QByteArray line; 
QDataStream stream(&line, QIODevice::WriteOnly); 
stream << y; 

и читать:

QVector<double> data; 
QDataStream stream(line); 
stream >> data; 
0

Общей практикой является сериализация данных в виде текста. Это сделает ваш сервер и клиент переносимым. Отправка двоичных данных по сети - не очень хорошая идея. Вы можете создать свой собственный текстовый протокол или использовать существующий (например, буферы протокола Google).

+2

Я не с вами голосовать, но не согласен с вашим ответом. Буферы протоколов - это двоичный протокол. TCP и UDP. –

+0

Согласен, что G.P.B. является двоичным протоколом. Я имел в виду, что нужно использовать строго определенный протокол, такой как QDataStream или G.P.B, для отправки данных и предотвращения отправки чистых двоичных данных C с помощью reinterpret_cast. – DmitryARN