我有一个unsigned char*
填充的字符不仅仅是ASCII,例如:`
¤ÝkGòd–ùë$}ôKÿUãšj@Äö5ÕnE„_–Ċ畧-ö—RS^HÌVÄ¥U` .
如果我reinterpret_cast
,如果我没有弄错,我会丢失字符,因为它们不是全部ASCII。我已到处搜索,但所有解决方案都需要某种类型的转换或转换来改变数据。这就是我所拥有的,哪些不起作用。
unsigned char* cipherText = cipher->encrypt(stringTest);
string cipherString(reinterpret_cast<char*>(cipherText)); //<-- At this point data changes in debugger
outputfile.open(outfile);
outputfile.close();
答案 0 :(得分:2)
你没有打电话给你应该打电话的string
constructor。而不是采用单个char *
参数的那个,你应该调用带有两个参数的那个 - char *
和长度。
basic_string( const CharT* s,
size_type count,
const Allocator& alloc = Allocator() );
在你的例子中使用它
unsigned char* cipherText = cipher->encrypt(stringTest);
size_t cipherTextLength = // retrieve this however the API allows you to
string cipherString(reinterpret_cast<char*>(cipherText), cipherTextLength);
outputfile.open(outfile);
// assuming outputfile is an ofstream
outputfile << cipherString;
outputfile.close();
请注意,调试器可能仍会指示截断的字符串,具体取决于它如何解释string
的内容。如果在编辑器中打开输出文件并检查字节,则应该看到预期的结果。
正如RemyLebeau在评论中提到的那样,如果您不需要std::string
用于任何其他目的,您甚至不需要创建它,只需写入ofstream
直接
outputfile.open(outfile);
outputfile.write(reinterpret_cast<char*>(cipherText), cipherTextLength);
outputfile.close();