0

引数でテキストを挿入し、それを自動的に16進数に変換するにはどうすればよいですか?

私は試してみました:

unsigned char aesKey[32] = argv[1];

しかし、エラーが発生します

出力は次のようになります。

unsigned char aesKey[32] = {
    0x53, 0x28, 0x40, 0x6e, 0x2f, 0x64, 0x63, 0x5d, 0x2d, 0x61, 0x77, 0x40, 0x76, 0x71, 0x77, 0x28, 
    0x74, 0x61, 0x7d, 0x66, 0x61, 0x73, 0x3b, 0x5d, 0x66, 0x6d, 0x3c, 0x3f, 0x7b, 0x66, 0x72, 0x36
};

unsigned char *buf;

aes256_context ctx;
aes256_init(&ctx, aesKey);

for (unsigned long i = 0; i < lSize/16; i++) {
    buf = text + (i * 16);
    aes256_encrypt_ecb(&ctx, buf);
}

aes256_done(&ctx);

前もって感謝します

4

3 に答える 3

1

CおよびC++では、次のようなコードがある場合

char name[]="John Smith";

コンパイラは、コンパイル時にそのchar配列のサイズと、すべての値を認識します。したがって、スタックフレームに割り当てて、値を割り当てることができます。

char * strptr = foo();のようなコードがある場合 char str [] = strptr;

コンパイラは、strptrが指す文字列のサイズと値を認識していません。これがC/C++では許可されていない理由です。

つまり、文字列リテラルのみをchar配列に割り当てることができ、それも宣言時にのみ割り当てることができます。

それで

char name[] = "John Smith";

許可されている。

char name[32];
name = "John Smith";

許可されていません。

memcpyを使用する

したがって、memcpyを使用できます。(または、他の人がほのめかしているc ++の代替手段を使用します)

unsigned char *aesKey;
size_t len = (strlen(argv[1])+1)*sizeof(unsigned char);
aesKey = malloc(len);
memcpy(aesKey, argv[1], len);

古いソリューション

(これが私の以前の答えです、上記の答えの方が良いです)したがって、strncpyを使用する必要があります。

unsigned char aesKey[32];
strncpy((char *) aesKey, argv[1], 32);

ルーチンがstrcpyではなくstrncpyであることに注意してください。strcpyは安全ではありません。(引数を修正してくれたPRouleauに感謝します)

strncpyがVisualStudioで使用できない場合は、strcpy_sを試す必要がある場合があります(Googleに感謝:user:427390)

于 2013-01-12T05:29:23.300 に答える
0

C / C ++では、コンパイラは配列を自動的に操作しません。それらをコピーする方法を指定する必要があります。

古き良き方法はmemcpy()を使用することです。より現代的な方法は、std :: copy()を使用することです。いずれの場合も、aesKeyにコピーする前に、argv[1]の長さを検証する必要があります。

16進数に変換するには、おそらく「AAEE3311」(最大2 * 32文字)のような文字列をバイトに変換する必要があります。std :: istringstreamを使用して、aesKeyの位置を位置ごとに入力する必要があります。

元:

std::istringstream Input(argv[1]);
Input >> std::hex >> aesKey[0];
于 2013-01-12T05:36:14.147 に答える
0

私はプログラムが以下のように呼ばれていると想像します-

myprog 0x53 0x28 0x40 0x6e 0x2f 0x64 0x63

プログラム内では、引数を配列に割り当てるためのループがあります-

const int size = 32;
unsigned char aesKey[size];
char* p;

for (int i = 1; i < argc || i < size; ++i)
{
    aesKey[i] = (unsigned char)strtol(argv[i], &p, 16);
}
于 2013-01-12T06:50:18.257 に答える