[C ++ STL的字符串等效于二进制数据

问题描述 投票:28回答:5

我正在编写C ++应用程序,我想知道C ++在内存中存储字节数组的常规方式是什么。

是否有类似字符串的内容,除了专门针对二进制数据。

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

c++ string stl binary
5个回答
38
投票

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


24
投票

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

std::string通常比std::vector<char>更方便,因为它提供了许多对处理二进制数据有用的方法,但vector没有提供。要解析/创建二进制数据,可以使用substr()+std::stringstream的重载之类的东西很有用。在矢量上,可以使用<algorithm>中的算法来实现相同的效果,但是比字符串方法笨拙。如果仅对“字符序列”进行操作,即使这些序列碰巧包含“二进制”数据,std::string也会为您提供通常需要的方法。


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来操纵任意字节缓冲区,因为我认为这可能会造成混淆,但这并不是闻所未闻的。


0
投票

std::basic_string<uint8_t>怎么样?


0
投票

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

发件人:https://en.cppreference.com/w/cpp/types/byte

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

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

© www.soinside.com 2019 - 2024. All rights reserved.