1

私がC++に触れてから久しぶりで、言語に堪能になったことがないので、無知を許してください。

XOR暗号化をいじくり回すために、次の小さなプログラムを作成しました。

#include <iostream>
#include <iomanip>
#include "string.h"

using std::cout;
using std::endl;
using std::hex;
using std::string;

string cipher(string msg, char key);

int main(void)
{
    string msg = "Now is the winter of our discontent, made glorious summer by this sun of York.";
    char key = 's';  // ASCII 115

    string ctext = cipher(msg, key);

    cout << "Plaintext:  " << msg << endl;
    cout << "Ciphertext (hex):  ";
    for (int i = 0; i < ctext.size(); i++)
        cout << hex << ctext[i];

    return 0;
}

string cipher(string msg, char key)
/*
    Symmetric XOR cipher
*/
{
    for(int i = 0; i < msg.size(); i++)
        msg[i] ^= key;

    return msg;
}

このコードは以下を出力します:

Plaintext:  Now is the winter of our discontent, made glorious summer by this sun of York.
Ciphertext (hex):  =SSSSSS_SSSS
SSSS*]

16進値を出力できないのはなぜですか?私は何が間違っているのですか?

また、一般的なアドバイスをいただければ幸いです。

4

1 に答える 1

2

16進数は整数に適用されます。ストリームに設定されているベースに関係なく、charは文字としてストリーミングされます。文字のACSIIコードを16進数で印刷する場合は、次を使用します。

 cout << hex << static_cast<int>(ctext[i]);
于 2012-11-04T19:01:59.883 に答える