我编写了多个简单的C++函数来将字节序列转换为字符串表示。
这是非常直接的,我确信我的逻辑是正确的,我认为这非常容易,直到我开始打印字符串,我发现输出是垃圾:
#包括<iostream>#包括<string>#包含<矢量>使用std::vector;typedef向量<uint8_t>字节;使用std::string;使用std::cout;使用命名空间std::literals;string DIGITS=“0123456789abcdef”s;静态内联字符串十六进制(字节arr){字符串repr=“”s;for(auto-chr:arr){repr+=“”+数字[(chr&240)>>4]+数字[chr&15];}报告擦除(0,1);退货代表;}字节文本={84, 111, 32, 98, 101, 32,111, 114, 32, 110, 111, 116,32, 116, 111, 32, 98, 101};//生存还是毁灭整型main(){cout<<十六进制(文本);}
2♠÷82♠÷82♠÷82♠÷
为什么会发生这种情况?
我知道我的逻辑是正确的,下面是直接翻译到Python的:
数字=“0123456789abcdef”定义字节字符串(数据):s=“”对于数据中的i:s+=“”+数字[(i&240)>>4]+数字[i&15]返回s[1:]
它的工作原理是:
>>>bytes_string(b“生存还是毁灭”)“第54页,共62页”
但为什么它在C++中不起作用呢?
我使用的是Visual Studio 2022 V17.9.7,编译器标志:
/permissive-/ifcOutput“hexlif_test\x64\Release\”/GS/GL/W3/Gy/Zc:wchar_t/Zi/Gm-/O2/sdl/Fd“hexLif_test\ x64\ Release\vc143.pdb”/Zc:inline/fp:precise/D“NDEBUG”/D“_CONSOLE”/D”_UNICODE“/D”UNICODE“/error报告:prompt/WX-/Zc:forScope/std:c17/Gd/Oi/MD/std:c+20/FC/Fa“hexlifytest\x64\释放”/EHsc/nologo/Fo“hexlifytest\x64\Release\”/Ot/Fp“hexLif_test\x46\Release \hexlife_test.pch”/diagnostics:column
我刚刚发现垃圾输出只发生在执行修复程序后的Debug模式下,我以调试模式下的C++20为目标,不知怎么的,代码导致了Debug方式下的垃圾输出,切换到发布模式解决了这个问题。在修复程序实现之前,我在发布模式下进行了编译,但出现了这个问题。