繁体   English   中英

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

[英]C++ convert std::string that contains binary data to char*

好吧,所以我在这里有点问题。

我正在做的是将二进制文件(在本示例中使用.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 *是强制性的。

你们有什么可以帮助的吗?

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

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

如果您希望将std::string的数据作为char* ,则可以将其获取。 要么:

std::string s = ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM