如何在没有reinterpret_cast的情况下将unsigned char *输出到文件

时间:2015-04-23 03:11:57

标签: c++ casting type-conversion unsigned

我有一个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();             

1 个答案:

答案 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();