0

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

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

它正在加密的文本是“我很高兴这有效”,使用 128 位密钥“狗”,此循环打印加密的前 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 可以使用的格式化代码,还是我必须跳过一些障碍?

多谢你们!

4

1 回答 1

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

于 2018-05-03T18:14:55.123 回答