2014-09-19 2 views
0

Я пишу программу, которая отправляет файлы с клиента QT на клиент Android.QByteArray :: number (int) длиной всего два байта

конкретной строке кода записывается длина префикса строки имени файла потока поддерживается между ними с помощью следующего кода:

qDebug() << socket.write(QByteArray::number((qint32)fileName.length())); 

Я литым fileName.length() в qint32, но по некоторым причинам выше кода записывает только 2 байта в поток сокета (то есть окно консоли показывает 2 от qDebug()).

Есть ли причина?

ответ

2

Литье до qint32 не имеет значения и не имеет никакой цели.

QByteArray::number создает ASCII текст Представление номера. В этом случае fileName.length() должен был иметь две цифры и находится между 10 и 99. Таким образом, содержимое массива байтов составляет две цифры ASCII. Обратите внимание, что нулевой терминатор не включен в length() или size() массива и поэтому не передается сокетом.

Что вы передаете это текст, в частности, строка, которая будет "21", что fileName.length() было 21.

код, который делает то, что вы собираетесь сделать, это:

QDataStream str(&socket); 
str << (qint32)fileName.length(); 

по умолчанию порядок байтов будет иметь большой порядковый номер (сетевой байтовый порядок). Вы можете выбрать другой порядок байтов:

str.setByteOrder(QDataStream::LittleEndian); 
str << ...; 
+1

Замечание о 'QDataStream': оно не обрабатывает частичную запись и чтение. Таким образом, если у вас нет 100% надежного сетевого подключения (локальный хост или хост домена unix может быть достаточно близок), вы не должны использовать его непосредственно в сетевом сокете. Вместо этого используйте 'QDataStream' в' QByteArray' и отправляйте/получайте это. – hyde

+1

@hyde Предположительно достаточно легко проверить, удалось ли вам после того, как все закончилось? Он не «обрабатывает» частичную запись/чтение, но также не сбой. –

+1

Да, я имею в виду, что невозможно вернуть частичные данные в поток и повторить попытку после того, как поступит больше данных. Состояние 'QDataStream :: ReadCorruptData' является неустранимым, AFAIK. – hyde

Смежные вопросы