LINUX.ORG.RU

Как заполнить QByteArray нужными данными не в конструкторе?

 ,


0

3

Смотрю на документацию QByteArray и не понимаю.

Есть конструктор, который может создать QByteArray из const char * и заданной длинны:

QByteArray(const char *data, int size = -1)


При этом написано, что происходит копирование.

Теперь есть похожая задача: надо заполнить QByteArray из const char * и заданной длинны, но уже не в конструкторе, а отдельной командой.

Методы setRawData/fromRawData:
QByteArray &QByteArray::setRawData(const char *data, uint size)

и
QByteArray QByteArray::fromRawData(const char *data, int size)

не делают копирование.

А метод append
QByteArray & append(const char *str, int len)

который мог бы помочь (у меня исходный QByteArray пустой), работает именно со строкой, и не копирует дальше первого нуля в данных.

И больше я не вижу методов, которые бы заполнили QByteArray обычным массивом байт.

★★★★★

Оператор присваивания религия запрещает использовать?

pon4ik ★★★★★
()
// Создаёшь объект
QByteArray buf;
// Выставляешь нужный размер
buf.resize(1024); // Не путать с reserve
// Копируешь
memcpy(buf.data(), src, 1024);
ox55ff ★★★★★
()
Последнее исправление: ox55ff (всего исправлений: 1)

Просто сконструируй первым конструктором и присвой старому объекту

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

Ты прав. Я про это как-то даже и не подумал.

ox55ff ★★★★★
()
QByteArray buf;
buf.resize(sizeCharStr);
QDataStream stream( &buf, QIODevice::WriteOnly );

stream.writeRawData( buf.data(), charStr, sizeCharStr );
asaks
()

https://github.com/qt/qtbase/blob/5.10/src/corelib/tools/qbytearray.cpp#L2133

QByteArray &QByteArray::insert(int i pos, const char *str, int len)
Я думаю, будет быстрее, чем operator= (я вообще боюсь пытаться осмыслить, что там делается) (UPD: operator= не подходит т.к. у ТС заранее известен размер, а вообще в нём делается copy-on-write копирование, как я понял)

jeuta ★★★★
()
Последнее исправление: jeuta (всего исправлений: 2)

не копирует дальше первого нуля в данных
Appends the first len characters of the string str to this byte array

не придумывай

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

И там же написано что длина строки не должна превышать саму строку:

Ensure that len is not longer than str.

И там же написано для обозначения данных unsigned char *str, в то время как в местах, где данные продставляют собой просто массив, на той же странице документации используется unsigned char *byte.

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

Все там документировано

Ensure that len is not longer than str

Это значит не лезь в неалоцированную память. str - просто имя переменной, а не null-terminated string.

If len is negative, the length of the string will be determined automatically using qstrlen(). If len is zero or str is null, nothing is appended to the byte array. Ensure that len is not longer than str.

qstrlen как раз и определяет длину строки по нулевому байту. Таким образом поведение

QByteArray & QByteArray::append(const char * str, int len)

сводится к поведению

QByteArray & QByteArray::append(const char * str)

только в случае если передается отрицательный len.

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

Все там документировано

Ты придумываешь то, чего в документации нет.

Ensure that len is not longer than str
Это значит не лезь в неалоцированную память.

Это значит ровно то что написано: нельзя указывать длину больше, чем длина строки str.

str - просто имя переменной, а не null-terminated string.

С чего бы это? Ясно же написали:

Appends the first len characters of the string str to this byte array and returns a reference to this byte array.

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

Ничего он не придумывает, просто кутэ-документатор был хреновый и не осилил сформулировать нормально, что len не должен превышать размер объекта в сишкином смысле. Вред овербалабольства во всей красе, т.к. это и так ясно. Твое нежелание доверять имеющейся формулировке естественно и понятно, но оснований настаивать на твоей интерпретации тоже нет.

В общем-то абсолютно все ssize_t / int len'ы при сишных строках работают именно так — больше нуля жрет сколько сказано, меньше нуля жрет до первого \0. Без доп.пояснений иное просто не имеет смысла, сам подумай почему.

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

Хотя в целом, в теории, я с тобой согласен в том, что если один мудила намудил в документации, то ничего не мешает другому намудить в реализации и всей толпой считать, что все ок. Кресты и кутэ в частности насквозь этим болотом пропитаны.

anonymous
()
12 марта 2019 г.

QByteArray arr_block; arr_block.append(static_cast<char*>(static_cast<void*>(&size)), 2); arr_block.append(static_cast<char*>(static_cast<void*>(&type)), 2); arr_block.append(static_cast<char*>(static_cast<void*>(&et_rez)), size - 6); arr_block.append(static_cast<char*>(static_cast<void*>(&tail)), 2);

Так работает.

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