C ++ STD二进制数据的等效字符串

时间:2009-05-07 23:14:51

标签: c++ string stl binary

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

除了专门针对二进制数据之外,还有类似字符串的东西。

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

5 个答案:

答案 0 :(得分:37)

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

答案 1 :(得分:23)

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

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

答案 2 :(得分: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来操纵任意字节缓冲区,因为我认为它可能会让人感到困惑,但这并不是闻所未闻的。

答案 3 :(得分:0)

std::basic_string<uint8_t>怎么样?

答案 4 :(得分:0)

有多种解决方案,但最接近的解决方案是std::vector<std::byte>>,因为它直接在代码中表达了意图。

来自:https://en.cppreference.com/w/cpp/types/byte

std :: byte是一个独特的类型,它实现byte的概念为 在C ++语言定义中指定。

类似于char和unsigned char,它可以用于访问原始内存 被其他对象占用(对象表示),但与其他对象不同 类型,它不是字符类型,也不是算术类型。一种 字节只是位的集合,并且为 是按位的。