LINUX.ORG.RU

[Qt] Контейнер для хранения произвольных байтовых последовательностей

 


0

0

QByteArray, несмотря на название, не подходит, т. к. ориентирован на хранение строк (с нуль-терминатором).

Подскажите, есть-ли в Qt что-нить, куда можно сложить заданное количество произвольных char-ов? Или я ослеп, или такого контейнера там действительно нет.

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

точнее для байтовых последовательностей лучше писать qint8 или int8_t. Первый из qt, второй из C99.

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

> Или вообще std::vector<char>?

Ви будете смеяться, но у меня проблемы с покланием в этот std::vector<char> и вынятием из него, например, size_t, или ещё чего-нить более длинного, чем char.

Ну, то-есть, покласть/вынять я могу, но так коряво по реализации получается -- хоть йад пей... По условиям, нужно сложить в этот char[] много-много элементов разных типов, что-то вроде тупенькой сериализации.

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

Сейчас, вот, вокруг QDataStream хожу, приглядываюсь.

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

> QByteArray, несмотря на название, не подходит, т. к. ориентирован на хранение строк (с нуль-терминатором).

QByteArray ориентирован на хранение _любых_ последовательностей байтов.

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

> QByteArray ориентирован на хранение _любых_ последовательностей байтов.

Попытка "пристегнуть" к уже имеющемуся его экземпляру, например, какой-нить size_t, мягко говоря, удручает... Неудобно. Блядь, и почему в сиране плюсах нет нормальной сериализации?

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

> Попытка "пристегнуть" к уже имеющемуся его экземпляру, например, какой-нить size_t, мягко говоря, удручает... Неудобно.

Покажи код.

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

char S0[]="1234567890123456789";
S0[9]='\0';
std::cout<<"S0="<<S0<<std::endl;
std::cout<<"sizeof(S0)="<<sizeof(S0)<<std::endl;
QByteArray array(S0,sizeof(S0));
std::cout<<"array.size()="<<array.size()<<std::endl;
size_t other=159;
array+=QByteArray((char*) (&other),sizeof(size_t));
std::cout<<"array.size()="<<array.size()<<std::endl;

Что-то вроде этого. А хотелось-бы

array+=QByteArray(size_t(159),sizeof(size_t));

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

> Ну да ладно, в принципе. И так сойдёт.

Сойдёт. А если ещё и завернуть это в template<typename T> название_сам_придумай(QByteArray &a, const T &val), то будет совсем круто.

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

push_byte(byte_stream & stream, uint8_t t)
{
   stream.push_back(t);
}

push32(byte_stream & stream, uint32_t t)
{
   push_byte(stream, t);
   push_byte(stream, t << 8);
   push_byte(stream, t << 16);
   push_byte(stream, t << 24);
}


плохому танцору, как говорится, всегда что-то мешает.

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

> плохому танцору, как говорится, всегда что-то мешает.

Да я-ж и не спорю. :-)

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

Кто тебе такое сказал?

namezys ★★★★
()

Изучайте устройство *stream (например, stringstream).
Туда входит и выходит всё что запрограммируете.

template <typename T>
mybuffer&  operator << (mybuffer& s, const T* v)
{
  //тупо выводим набор его байтов
  for(int i = 0; i < sizeof(T); i++)
    s.push_back(*(reinterpet_cast<const char*>(T) + i));
}
mybuffer&  operator << (mybuffer& s, const std::string& v)
{

  for(int i = 0; i < v.size(); i++)
    s.push_back(v[i]);
}



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

> Изучайте устройство *stream

Спасибо, конечно, но в психушку мне ещё рано. Разработчикам iostream гвоздь в голову вбить надо. Александреску легче читается...

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

Для упрощения написания своих потоков есть boost.iostream.

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