好的,所以我在这里遇到了一些问题。
我正在做的是将二进制文件(在本例中我使用.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 *是强制性的。
你们有人可以帮忙吗?
答案 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();