LINUX.ORG.RU

Как записать QString в QByteArray?

 ,


0

1

В каком месте я делаю что-то не то?

#include <QDebug>
#include <QBuffer>
#include <QDataStream>
#include <QIODevice>
#include <QByteArray>
#include <QString>

int main( int argc, char** argv )
{
    QByteArray ba;
    QBuffer buf( &ba );
    buf.open( QIODevice::ReadWrite );
    QDataStream in( &buf );
    in << QString( "String" );
    buf.close();
    qDebug() << ba;
// на выходе: "
}
★★★★★

Ответ на: комментарий от unC0Rr

Я в общем-то уже думал, что где-то какой-то буфер не сбрасывается. Но ни у QDataStream, ни у QIODevice метода flush() или чего-то похожего я не нашёл.

KblCb ★★★★★
() автор топика

Что ты ожидаешь на выходе-то получить? Подсказка: в QByteArray будут бинарные данные.

Deleted
()
Ответ на: комментарий от nanoolinux
#include <QDebug>
#include <QBuffer>
#include <QDataStream>
#include <QIODevice>
#include <QByteArray>
#include <QString>

int main( int argc, char** argv )
{
	QByteArray ba;
	QBuffer buf(&ba);
	buf.open(QIODevice::ReadWrite);
	QDataStream in( &buf );
	in << QString("String");
	buf.close();
	puts(QString(ba).toStdString().c_str());
	for (int i=0; i<ba.length(); ++i) {
		printf("%c - %x\n", ba.at(i), ba.at(i));
	}
	printf("\n");
}

так запусти.

nanoolinux ★★★★
()
Ответ на: комментарий от ymuv

#include <QCoreApplication>
#include <QByteArray>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QByteArray ba;
QString qs= «String»;
ba+=qs;
ba+=«string2»;
qDebug()<<ba;
//return a.exec();
}

ymuv ★★★★
()
Ответ на: комментарий от ymuv
#include <QCoreApplication>
#include <QByteArray>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
   {
      QCoreApplication a(argc, argv);
      QByteArray ba;
      QString qs= "String";
      ba+=qs;

      ba+="string2";

      qDebug()<<ba;
      //return a.exec();
   }
ymuv ★★★★
()
Ответ на: комментарий от ymuv

Есть принципиальное отличие. ТС, видимо, хочет заэнкодить набор данных в буфер, а не просто несколько строк склеить в bytearray.

unC0Rr ★★★★★
()
Ответ на: комментарий от nanoolinux

Я уже догадался, что у меня не работает вывод через QByteArray'а через qDebug(). Не могу понять почему.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

Ну так оно тебе и печатает строку чаров. Но вот незадача, строка начинается с нулевого байта :)

Deleted
()
Ответ на: комментарий от Deleted

Во-первых откуда берётся нулевой байт? Во-вторых что мешает ему изобразить его как \0?

KblCb ★★★★★
() автор топика
Ответ на: комментарий от KblCb

Во-первых откуда берётся нулевой байт?

QDataStream сериализует QString как little-endian 32-битное целое (длина строки в байтах), за которым следует сама строка в UTF-16. Длина строки в UTF-16 у тебя 12 байт, поэтому первые три байта в QByteArray будут нулевыми.

Во-вторых что мешает ему изобразить его как \0?

Это уже вопрос к автору класса QDebug :)

Deleted
()
Ответ на: комментарий от Deleted

Т.е. big-endian целое, конечно же. Чтобы не быть голословным, вот содержимое твоего QByteArray:

00 00 00 0c 00 53 00 74 00 72 00 69 00 6e 00 67
Deleted
()

Так проще:

QByteArray ba;
QDataStream in(&ba, QIODevice::WriteOnly);
in << QString("String");

Devix
()
Ответ на: комментарий от KennyMinigun

Как выяснилось, там проблема в чтении QByteArray'а в qDebug(). С записью всё нормально. Кроме того я в самом начале выдал желаемое за действительное, рассчитывая на то что QByteArray мне как-то поможет писать данные в уже выделенный сырой массив. Не помог. Поэтому я написал свой Buffer (унаследовав его от QIODevice), который умеет вышеозначенное и у меня теперь всё хорошо.

KblCb ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.