2015-12-10 7 views
2

Обзор проблемы:
ОС: Ubuntuкопирование голец в QByteArray с потоком данных содержит некоторые дополнительные байты

Я использую Qt утилита для получения видеоданных от удаленной машины (удаленной машине с помощью GStreamer для отправки живые данные) и записать данные в порт, например, 5000.

Порт 5000 уже привязан к другой утилите gstreamer. эта утилита прослушивает порт 5000 и преобразует данные в потоковое видео. Очевидно, что вещи не совсем работают, и я не могу просмотреть видео. Поэтому у меня есть два вопроса:

1) С утилитой Qt, законно ли писать на порт 5000, хотя порт связывается с утилитой gstreamer.

2) Я использую стороннюю библиотеку и ее api для получения данных из внешнего источника. Данные хранятся в массиве символов. Если я преобразую это в qbytearray, то qbytearray имеет тот же размер, что и char buffer. пример

rc = zco_receive_source(sdr, &reader, bytesToRead, buffer); // this is 3rd part function 


     qDebug() << " copy buffer size =" << rc; // genrally this size is 1412 

     QByteArray msgRecvd; 

     msgRecvd = QByteArray(reinterpret_cast<char*>(buffer), rc); 

     if(! msgRecvd.isEmpty()) 
     { 
      qDebug() << " size of msgRecv =" << msgRecvd.size();// again 1412 

      udpSock->writeDatagram(msgRecvd, QHostAddress::LocalHost, 5000); 
     } 

Но если я использую QDataStream, QbyteArray получил 4 дополнительных байта. Код, приведенный ниже

rc = zco_receive_source(sdr, &reader, bytesToRead, buffer); // this is 3rd part function 


    qDebug() << " copy buffer size =" << rc; // genrally this size is 1412 

    QByteArray msgRecvd; 
    QDataStream dataStream(&msgRecvd, QIODevice::WriteOnly); 

    dataStream.writeBytes((const char*)buffer, rc); 

    if(! msgRecvd.isEmpty()) 
    { 

     qDebug() << " size of msgRecv =" << msgRecvd.size();// got 4 extra bytes .. size is 1415. why ??? 

     udpSock->writeDatagram(msgRecvd, QHostAddress::LocalHost, 5000); 
    } 

Я хочу знать, почему QByteArray получил дополнительный характер и нужно ли мне сериализация данных, чтобы направить его в порт 5000?

ответ

1

Ответ на второй вопрос: Попробуйте QDataStream :: writeRawData().

Форма Qt документы:

QDataStream & QDataStream::writeBytes(const char * s, uint len) 
Writes the length specifier len and the buffer s to the stream and returns a reference to the stream. 
The len is serialized as a quint32, followed by len bytes from s. Note that the data is not encoded. 
+0

благодаря спариванию. это был копия паста ошибка. Я изменил его. – samprat

+0

ok, обновил мой ответ – kewl