0

印刷すると次のようになる unsigned int[16] 配列があります。

4418703544ED3F688AC208F53343AA59

印刷に使用されるコードは次のとおりです。

for (i = 0; i < 16; i++)
    printf("%X", CipherBlock[i] / 16), printf("%X",CipherBlock[i] % 16);
printf("\n");

この unsigned int 配列「CipherBlock」を unsigned char * のみを受け取る decrypt() メソッドに渡す必要があります。情報を失うことなく、「CipherBlock」配列から unsigned char 配列にすべてを正しく memcpy するにはどうすればよいですか?

私の理解では、unsigned int は 4 バイト、unsigned char は 1 バイトです。「CipherBlock」は 16 個の符号なし整数であるため、合計サイズ (バイト単位) = 16 * 4 = 64 バイトです。これは、unsigned char[] 配列の長さが 64 である必要があるということですか?

もしそうなら、以下はうまくいきますか?

unsigned char arr[64] = { '\0' };
memcpy(arr,CipherBlock,64); 

これはうまくいかないようです。何らかの理由で、「CipherBlock」の最初のバイトのみが「arr」にコピーされます。その後の「arr」の残りは「\0」です。

4

3 に答える 3

2

Anint少なくともshort16 ビットであり、その点ではa と同じです。

unsigned intあなたの場合、すべての値が 0-255 または 00-FF のように見えますが、これはunsigned char. ただし、一方を他方に変換する適切な方法はキャストです。

for (int i=0; i<16; ++i) arr[i] = (unsigned char) CipherBlock[i];

decrypt()しかし、期待するデータの種類を指定していません。署名から、整数データ (通常、文字列はchar*またはconst char*) であると思われますが、コンテキストがないと確認するのは困難です。

printf("%02X", CipherBlock[i]);印刷用にもできることに注意してください。

于 2012-09-09T21:14:02.087 に答える
2

CipherBlockポインタをキャストしunsigned char *て渡してみませんか?

decrypt((unsigned char *)CipherBlock);
于 2012-09-09T21:02:22.703 に答える
1

memcpy を使用したり、直接キャストしたりできないように、数値を再パックする必要があります。アイブはそれを正しく持っています。

unsigned char array[16];
for(int i = 0; i < 16; i++) {
    array[i] = CipherBlock[i];
}
于 2012-09-09T21:14:50.180 に答える