5

unsigned char 配列を 16 個の 16 進数値で初期化したいと考えています。ただし、これらの値を適切に初期化/アクセスする方法がわからないようです。直感的にアクセスしようとしても、まったく価値がありません。

これは私の出力です

The program was run with the following command: 4
Please be a value! -----> p
Here's some plaintext 

以下のコードで実行すると -

int main(int argc, char** argv)
{
  int n;
  if (argc > 1) {
    n = std::stof(argv[1]);
  } else {
    std::cerr << "Not enough arguments\n";
    return 1;
  }

  char buff[100];
  sprintf(buff,"The program was run with the following command: %d",n);
  std::cout << buff << std::endl;

unsigned char plaintext[16] = 
   {0x0f, 0xb0, 0xc0, 0x0f,
    0xa0, 0xa0, 0xa0, 0xa0,
    0x00, 0x00, 0xa0, 0xa0,
    0x00, 0x00, 0x00, 0x00};

unsigned char test = plaintext[1]^plaintext[2];

std::cout << "Please be a value! -----> " << test << std::endl;

std::cout << "Here's some plaintext " << plaintext[3] << std::endl;

  return 0;
}

文脈上、これは学校のグループ プロジェクトの一部です。私たちは最終的に Serpent 暗号を実装しようとしていますが、unsigned char 配列に悩まされ続けています。私たちのプロジェクト仕様では、Java のバイト配列となるものを受け取る 2 つの関数が必要であると述べています。C++ で最も近いものは unsigned char[] だと思います。それ以外の場合は、ベクトルを使用します。コードの他の場所で、unsigned char 配列を取り、その値を 4 つの long long int (キーは 256 ビットである必要があります) にパックし、それらの int に対してさまざまなビットシフトおよび xor 操作を実行して、暗号化アルゴリズムに必要なキー。私がやろうとしていることの十分な背景であることを願っています。ここでは、基本的な C++ 機能を見落としているだけだと思います。助けてくれてありがとう!

4

3 に答える 3

9

Acharは、-128 <= n <= +127 を格納できる 8 ビット値であり、さまざまなエンコーディングで文字表現を格納するためによく使用され、一般的に - 西洋のローマ字のインストールでは -charエンコードされた ASCII または utf の表現を示すために使用されます値。「エンコード済み」とは、文字セットの記号/文字に数値が割り当てられていることを意味します。周期表を元素のエンコーディングと考えてください。つまり、「H」(水素) は 1、ゲルマニウムは 32 としてエンコードされます。ASCII (および UTF-8) 表では、位置 32 は「スペース」と呼ばれる文字を表します。

char 値に対してを使用する場合operator <<、デフォルトの動作では、ASCII 文字コードなどの文字エンコーディングを渡すと想定されます。もしあなたがそうするなら

char c = 'z';
char d = 122;
char e = 0x7A;
char f = '\x7a';
std::cout << c << d << e << f << "\n";

4 つの割り当てはすべて同等です。'z' は のショートカット/構文糖、char(122)1220x7Aの 16 進数、'\x7a' は 0x7a または 122 の値を持つ ASCII 文字を形成するエスケープです - iez

多くの新しいプログラマーが間違っているところは、彼らがこれを行うことです:

char n = 8;
std::cout << n << endl;

これは「8」を出力せず、ASCII テーブルの位置 8 に ASCII 文字を出力します。

ちょっと考えてみてください:

char n = 8;  // stores the value 8
char n = a;  // what does this store?
char n = '8'; // why is this different than the first line?

少し巻き戻してみましょう:120変数に格納するとき、それは ASCII 文字を表すことができますが、最終的に格納されるのは単純で単純な'x'数値だけです。120

具体的122には、Latin1、ISO-8859-1、UTF-8、または同様のエンコーディングを使用する文字セットからフォント エントリを検索するために最終的に使用する関数に渡す120場合、 'z'.

結局のところ、charは標準の整数値型の 1 つにすぎず、値を格納でき、簡単に、、またはなどに-128 <= n <= +127昇格できます。shortintlonglong long

通常は文字を表すために使用されますが、「非常に小さな値しか格納していない」(整数のパーセンテージなど) という意味でもよく使用されます。

int incoming = 5000;
int outgoing = 4000;
char percent = char(outgoing * 100 / incoming);

数値を出力したい場合は、それを別の値の型に昇格させるだけです:

std::cout << (unsigned int)test << "\n";
std::cout << unsigned int(test) << "\n";

または推奨される C++ の方法

std::cout << static_cast<unsigned int>(test) << "\n";
于 2013-11-13T06:40:32.600 に答える
2

答えはこれと同じくらい簡単だと思います(あなたが何を求めているのか完全には明確ではありません)

std::cout << "Please be a value! -----> " << static_cast<unsigned>(test) << std::endl;

char または unsigned char の数値を出力する場合は、最初に int または unsigned にキャストする必要があります。

当然のことながら、デフォルトでは、char は整数ではなく文字として出力されます。

ところで、このファンキーなコード

char buff[100];
sprintf(buff,"The program was run with the following command: %d",n);
std::cout << buff << std::endl;

より簡単に次のように記述されます

std::cout << "The program was run with the following command: " << n << std::endl;
于 2013-11-13T06:16:52.263 に答える
0

std::coutstd::cinchar 変数は常に char として扱います
。 int として入力または出力したい場合は、以下のように手動で行う必要があります。

std::cin >> int_var; c = int_var;
std::cout << (int)c;

scanf や printf を使用する場合は、フォーマット パラメータ ("%d"、"%c"、"%s") が入力バッファ (整数、文字、文字列) を変換する方法を示しているため、このような問題はありません。

于 2013-11-13T07:07:06.810 に答える