我想阅读一个二进制文件并使用类似std::string
的内容来自动调整缓冲区的大小等等。
我正在使用Visual C ++。我有什么选择?
答案 0 :(得分:10)
std::string
类已经处理了嵌入了NUL字符的数据。你遇到什么问题?
请注意,使用.c_str()
方法时,任何嵌入的NUL字符都将终止返回的C样式字符串。
答案 1 :(得分:8)
std::string
应该是安全的...您只需要小心使用.c_str()
方法。使用.data()
。
答案 2 :(得分:5)
您可以随时使用std::vector<unsigned char> v
(或您期望的任何类型的输入),然后只需&v[0]
和v.size()
来获取大小的缓冲区。
答案 3 :(得分:2)
是的,您可以在std::string
中嵌入空值。
示例:
std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);
注意:std::string
的{{1}}成员将始终在返回的char缓冲区中附加一个空字符;但是,c_str()
的{{1}}成员可能会也可能不会将空字符附加到返回的char缓冲区。
小心操作符+ =
要注意的一件事是不要在RHS上使用std::string
和data()
。它只会在空字符之前加起来。
例如:
operator+=
正确的方法:
char*
存储更常见的二进制数据以使用std :: vector
通常,使用std::string s = "hello";
s += "\0world";
assert(s.length() == 5);
存储任意二进制数据更为常见。
std::string s = "hello";
s += std::string("\0world", 6);
assert(s.length() == 11);
这可能更常见,因为std::vector
的{{1}}和std::vector<char> buf;
buf.resize(1024);
char *p = &buf.front();
成员返回const指针,因此内存不可修改。使用&amp; buf.front(),您可以直接修改缓冲区的内容。
答案 4 :(得分:0)
std :: string允许使用NUL字符,因此您可以继续使用它。
使用c_str()或data()没有问题。是的,嵌入式NUL将存在于您的数据中,但是如果您不使用它们来终止字符串(您需要调用length()来查找字符串中有多少字节)那么一切都会好的。