Строка С++ STL, эквивалентная двоичным данным
Я пишу приложение на С++, и мне было интересно, что обычный способ хранения байтового массива на С++ в памяти.
Есть ли что-то вроде строки, кроме специально сделанных для двоичных данных.
Сейчас я использую массив * unsigned char ** для хранения данных, но лучше было бы использовать STL/С++.
Ответы
Ответ 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
для управления произвольными байтовыми буферами, поскольку я думаю, что это потенциально запутывает, но это не неслыханная практика.