C++ STL的二进制数据字符串等价

The*_*own 28 c++ string binary stl

我正在编写一个C++应用程序,我想知道在内存中存储字节数组的C++传统方法是什么.

是否有类似字符串的东西,除了专门为二进制数据.

现在我使用*unsigned char**数组来存储数据,但更像STL/C++的东西会更好.

CAd*_*ker 38

我用了std::vector<unsigned char>.您需要的大多数操作都可以使用带有迭代器范围的STL来完成.另外,请记住,如果您确实需要原始数据,&v[0]则保证提供指向底层数组的指针.

  • 当`v.data()`更清楚时,无需依赖`&v [0]`. (7认同)
  • @LimitedAtonement确实,然而在2009年``data()`没有在`std :: vector`上定义. (4认同)

sth*_*sth 24

您也可以使用std::string二进制数据.数据的长度std::string是显式存储的,而不是由null终止确定的,因此空字节在a中没有特殊含义std::string.

std::string通常比std::vector<char>提供许多方法更方便,因为它提供了许多方法,可用于处理二进制数据但不提供vector.要解析/创建二进制数据,有必要substr()为您提供重载+std::stringstream优点.在向量上,<algorithm>可以使用算法来实现相同的效果,但它比字符串方法更笨拙.如果您只是对"字符序列"进行操作,std::string则为您提供通常需要的方法,即使这些序列恰好包含"二进制"数据.

  • 或std :: vector <unsigned char> (5认同)
  • @bdonlan:来自&obj [0]的可写缓冲区也适用于std :: string,隐含地通过其他要求.事实上,0x使这个显而易见. (5认同)

Don*_*hey 21

你应该使用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操纵任意字节缓冲区,因为我认为这可能会让人感到困惑,但这并不是闻所未闻的.