以十六进制格式输出ASCII?

时间:2018-05-03 18:02:33

标签: c++ hex output ascii aes

我正在尝试为学校项目实施AES。我的目标是将加密文本输出到屏幕和.txt文件。加密完全符合预期,我可以通过查看来验证这一点:

    for (int j = 0; j<object.words * 4; j++)
    {
        printf("%02x ", Encryptor.out[j]);
    }

它正在加密的文本是“我很高兴这个工作”,使用128位密钥'dog',并且此循环打印加密的前16个字符,其中显示:

c8 88 45 0d 5d 40 ff 5b a4 55 91 c9 c4 00 f5 a4

我已经确认这是AES应该在此上下文中打印的内容。后来,我有以下输出行:

this is Encryptor.out[0] in cout: ╚
This is Encryptor.out[0] in printf with the format code '%02x': c8
Press any key to continue . . .

我的cout调用可能只需要一个格式化代码,所以我并不关心。目前的复杂情况是:

ofstream OutFile("Encrypted.txt");
Outfile << Encryptor.out[0];

此时,Encrypted.txt中包含的唯一内容是单个字符“È”。我知道十六进制中的c8是ASCII中的'È',但我希望它打印原始的十六进制值。

所以最终,我的问题是,如何将这个字符作为'c8'保存在我的输出文件中?是否存在ofstream可以使用的格式化代码,或者我是否必须跳过一些箍?

谢谢你们!

1 个答案:

答案 0 :(得分:2)

与@stark评论一样,要以十六进制打印数据,您可以使用std::hex来修改数据的格式化方式。但是,std::hex仅更改数字的打印方式,因此您需要告诉编译器将文本视为数字。幸运的是,有一种简单的方法可以做到这一点。你可以使用

ofstream OutFile("Encrypted.txt");
OutFile << std::hex;
for (const char c : Encryptor.out[0])
{
    OutFile << static_cast<int>(c);
}
// Reset back to normal printing
OutFile << std::dec;

您将获得正确的十六进制值,而不是重音字符E.

在这里查看std::hex http://en.cppreference.com/w/cpp/io/manip/hex