Подтвердить что ты не робот

Строка С++ STL, эквивалентная двоичным данным

Я пишу приложение на С++, и мне было интересно, что обычный способ хранения байтового массива на С++ в памяти.

Есть ли что-то вроде строки, кроме специально сделанных для двоичных данных.

Сейчас я использую массив * unsigned char ** для хранения данных, но лучше было бы использовать STL/С++.

4b9b3361

Ответ 1

Я бы использовал std::vector<unsigned char>. Большинство операций, которые вам нужны, могут быть выполнены с использованием STL с диапазонами итераторов. Кроме того, помните, что если вам действительно нужны необработанные данные, &v[0] гарантированно даст указатель на базовый массив.

Ответ 2

Вы можете использовать std::string также для двоичных данных. Длина данных в std::string хранится явно и не определяется нулевым завершением, поэтому нулевые байты не имеют специального значения в std::string.

std::string часто более удобен, чем std::vector<char>, поскольку он предоставляет множество методов, полезных для работы с двоичными данными, но не предоставляемых vector. Для анализа/создания двоичных данных полезно иметь такие вещи, как substr(), перегрузки для + и std::stringstream в вашем распоряжении. На векторах алгоритмы из <algorithm> могут использоваться для достижения тех же эффектов, но это более неуклюжие, чем строковые методы. Если вы просто выполняете "последовательности символов", std::string предоставляет вам методы, которые вы обычно хотите, даже если эти последовательности содержат "двоичные" данные.

Ответ 3

Вы должны использовать std::vector<unsigned char> или std::vector<uint8_t> (если у вас современный stdint.h заголовок). Нет ничего плохого в использовании unsigned char[] или uint8_t[], если вы работаете с буферами фиксированного размера. Где std::vector действительно сияет, когда вам нужно часто расти или присоединяться к своим буферам. Итераторы STL имеют ту же семантику, что и указатели, поэтому алгоритмы STL будут одинаково хорошо работать с std::vector и обычными старыми массивами.

И как отметил CAdaker, выражение &v[0] гарантированно даст вам базовый указатель на векторный буфер (и он будет гарантированно быть одним непрерывным блоком памяти). Эта гарантия была добавлена ​​в добавление к стандарту С++.

Лично я бы избегал использовать std::string для управления произвольными байтовыми буферами, поскольку я думаю, что это потенциально запутывает, но это не неслыханная практика.