C ++将包含二进制数据的std :: string转换为char *

时间:2014-10-31 02:02:24

标签: c++ string base64

好的,所以我在这里遇到了一些问题。

我正在做的是将二进制文件(在本例中我使用.exe文件)转换为Base64字符串,然后将其转换回二进制数据以将其写入磁盘。

到目前为止,这段代码很有用:

std::string str = base64_decode(base64str); // base64str is the base64 string made of the actual .exe file
std::ofstream strm("file.exe", std::ios::binary);
strm << str;
strm.close();

正在按预期创建文件“file.exe”,我可以运行它。

现在我的问题是我需要解密文件为 char * 而不是std :: string,但只要我调用此代码

str.c_str();

将其转换为const char *或char *,内容突然不再等于 str 中包含的二进制数据,而是:

MZP

所以,例如以下代码

std::string str = base64_decode(base64str);
std::ofstream strm("file.exe", std::ios::binary);
char* cstr = new char[str.length()-1];
strcpy(cstr, str.c_str());
strm << cstr;
strm.close();

会创建file.exe,但这次它将包含“MZP”而不是实际的二进制数据

我不清楚如何解决这个问题。当然,char *是强制性的。

你们有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

std::string::c_str()返回一个“C字符串”,它是一个以NUL结尾的字符数组。在数据结束之前,您的二进制数据肯定有NUL终结符。这就是您的数据被截断的原因。 (在十六进制编辑器中查看,我打赌字节0x03为零。)

因此,您应该使用std::basic_string::data来获取指向字符串所包含的原始数据的指针。复制或写入此数据时,您不希望使用strcpy(以NUL字节停止),而是使用memcpy或类似数据。字符串包含的数据大小可以从std::basic_string::size获得。

答案 1 :(得分:0)

如果您想将std::string内的数据作为char*,您可以抓住它。之一:

std::string s = ...

char* c1 = &s[0];
char* c2 = const_cast<char*>(s.c_str());
char* c3 = &s.front();