LINUX.ORG.RU

Pure c++ byteaarray best practice.

 bytearray,


0

1

Есть ли в голом c++ удобная абстракция для rawdata, что бы можно было узнать размер данных и записать их в поток ?

Лучше всего то что мне нужно отражено в классе QByteArray из всеми(вот было бы круто :)) любимого фреймворка Qt.


Есть ли в голом c++ удобная абстракция для rawdata

Вон как анон написал

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

Первое что пришло в голову

template <class T>
void f(const T& t)
{
    std::copy(t.begin(), t.end(), std::ostream_iterator<typename T::value_type>(std::cout, " "));
}

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

char так то по стандарту вроде как байт, а ваш u_int8_t нечто не стандартизированное судя по виду, хотя могу и ошибаться. В любом случае выбрал std::basic_string<char> в качестве байт массивов, всем спасибо.

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

ты не можешь, ты точно ошибаешься. uint8_t стандартизирован по самые помидоры. А вот char в военное время может быть и два, и даже четыре байта (/me вспомнил dec alpha и пустил слезу).

p.s. ссылка на документацию для убогих: http://en.cppreference.com/w/cpp/types/integer

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

Ты не прав. char по стандарту имеет минимальный размер, т.е. sizeof(char) == 1, а все остальные типы меряются от него.

Ты путаешь байт и октет. байт не всегда является октетом(8битов), хотя на современных архитектурах это так. Для размера char'а есть константа CHAR_BIT.

Но с другой стороны, C99 требует наличие uint8_t(С++11 вроде как допускает, что он будет больше 8бит, если этого требует архитектура), а поскольку sizeof(char) == 1, то получается, что CHAR_BIT должен быть всегда равен 8, иначе не срастется... Но это следует уточнить.

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

А вот char в военное время может быть и два, и даже четыре байта

Што? По ссылке <cstdint> но то, что по стандарту char - это 1 байт, никто не отменял.

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

тогда на такой архитектуре uint8_t не должен быть определён, имхо

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

А чем std::string лучше std::vector<char>?

тем, что писать меньше

Хуже тем, что string не поюзать как изменяемуй буфер.

это еще почему? только так его и использую

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

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

Сколько битов в байте - зависит от архитектуры, октетом он быть формально не обязан, хотя это уже практически (неформальный)стандарт.

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

В новом стандарте - можно и строки юзать, как буфер - теперь там те же гарантии, что и у вектора

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

Потому, что в старом стандарте у тебя не было гарантий линейного размещения буфера строки в памяти(такие гарантии были только у вектора).

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

В старом стандарте (98 года) таких гарантий не было даже у вектора. Эти гарантии появились только в стандарте 2003 года.

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

Всю жизнь байтом называли минимально адресуемое на данной архитектуре значение

Еще байтом называют октет. Нет, я не собираюсь ввязываться в дискуссию о том, что более правильно.

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

2003 - это и есть старый стандарт.

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

Ну так сложилось, что неоктетных байтов уже нет(ну может в нескольких маргинальных архитектурах).

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

В С++03 я не нашел про линейность. А на С++11 мне пока не перейти...

p.s. Как-то встретил в коде уё****ую функцию, которая использовала const_cast<char*>str.data(), причём не на самой строке, а на ее копии, т.к. параметр передавался по значению. Но по стечению обстоятельств оно работало, т.к. строки в юзаемой libstdc++ были copy on write :)

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

Посмотрел, в 2011 эту оплошность исправили, также ликвидировали такое недоразумение как возможно существования COW строк.

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

21.4.1 basic_string general requirements

5) The char-like objects in a basic_string object shall be stored contiguously.

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

ratatosk
()
Последнее исправление: ratatosk (всего исправлений: 1)
std::vector<uint8_t>

?

   template<typename _Tp, typename _Alloc = std::allocator<_Tp>> _Tp*
       std::vector< _Tp, _Alloc >::data ()        Returns a pointer such that [data(), data() + size()) is a valid range.
       For a non-empty vector, data() == &front().

Definition at line 858 of file stl_vector.h.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

since x11, так что во первых нефиг срать в решеной теме, во вторых зачем говорить об убогости если сам то ...

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