Строковый эквивалент C ++ STL для двоичных данных - PullRequest
27 голосов
/ 08 мая 2009

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

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

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

Ответы [ 3 ]

37 голосов
/ 08 мая 2009

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

23 голосов
/ 08 мая 2009

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

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

21 голосов
/ 08 мая 2009

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

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

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

...