这不是实际的代码,但这代表了我的问题。
std::string str1 = "head";
char *buffer = "body\0body"; // Original code has nullbytes;
std::string str2 = "foot";
std::vector<char> mainStr(buffer, buffer + strlen(buffer));
我想将str1
和str2
放入mainStr
订单:
headbody \ 0bodyfoot
因此维护二进制数据。这有可能吗?
PS :感谢您告诉strlen
部分错误。我只是用它来表示buffer
的长度。 :)
答案 0 :(得分:3)
应该有一些方法来定义“缓冲区”中的数据长度。 通常字符0用于此,大多数标准文本函数都假定这一点。因此,如果您将字符0用于其他目的,则必须提供另一种方法来查找数据长度。
仅举例:
char buffer[]="body\0body";
std::vector<char> mainStr(buffer,buffer+sizeof(buffer)/sizeof(buffer[0]));
这里我们使用数组,因为它提供了指针 - 存储数据大小的更多信息。
答案 1 :(得分:2)
您不能使用strlen
,因为它使用'\ 0'来确定字符串的结尾。但是,以下内容将满足您的需求:
std::string head = "header";
std::string foot = "footer";
const char body[] = "body\0body";
std::vector<char> v;
v.assign(head.begin(), head.end());
std::copy(body, body + sizeof(body)/sizeof(body[0]) - 1, std::back_inserter<std::vector<char> >(v));
std::copy(foot.begin(), foot.end(), std::back_inserter<std::vector<char> >(v));
因为字符缓冲区在字符串的末尾添加了一个NUL字符,所以你要忽略它(因此从最后一个迭代器得到-1)。
答案 2 :(得分:1)
您可以使用std::vector<char>::insert
将所需数据附加到mainStr
。
这样的事情:
std::string str1 = "head";
char buffer[] = "body\0body"; // Original code has nullbytes;
std::string str2 = "foot";
std::vector<char> mainStr(str1.begin(), str1.end());
mainStr.insert(mainStr.end(), buffer, buffer + sizeof(buffer)/sizeof(buffer[0]));
mainStr.insert(mainStr.end(), str2.begin(), str2.end());
免责声明:我没有编译它。
答案 3 :(得分:1)
顺便说一句。如果你的字符串中有空字节,strlen
将无效!
要插入到矢量中的代码是:
前:
mainStr.insert(mainStr.begin(), str1.begin(), str1.end());
回:
mainStr.insert(mainStr.end(), str2.begin(), str2.end());
使用上面的代码(使用strlen
将打印)
headbodyfoot
编辑:刚刚将copy
更改为insert
,copy
要求我认为空间可用。
答案 4 :(得分:1)
您可以使用IO流。
std::string str1 = "head";
const char *buffer = "body\0body"; // Original code has nullbytes;
std::string str2 = "foot";
std::stringstream ss;
ss.write(str1.c_str(), str1.length())
.write(buffer, 9) // insert real length here
.write(str2.c_str(), str2.length());
std::string result = ss.str();
std::vector<char> vec(result.c_str(), result.c_str() + result.length());
答案 5 :(得分:0)
str1和str2是写入文本的字符串对象。
我希望编译器在语句上失败,比如缓冲区的声明,我不在乎它破坏了多少遗留代码。如果你还在构建它,你仍然可以修复它并放入const。
您需要更改向量声明,因为strlen将停在第一个空字符处。如果你做了
char buffer[] = "body\0body";
然后sizeof(缓冲区)实际上会让你接近你想要的,尽管你也会得到结束的空终结符。
一旦你的矢量mainStr设置正确,你可以这样做:
std::string strConcat;
strConcat.reserve( str1.size() + str2.size() + mainStr.size() );
strConcat.assign(str1);
strConcat.append(mainStr.begin(), mainStr.end());
strConcat.append(str2);
如果使用buffer,buffer + sizeof(buffer)-1
设置了vector答案 6 :(得分:0)
mainStr.resize(str1.length() + str2.length() + strlen(buffer));
memcpy(&mainStr[0], &str1[0], str1.length());
memcpy(&mainStr[str1.length()], buffer, strlen(buffer));
memcpy(&mainStr[str1.length()+strlen(buffer)], &str2[0], str2.length());