このコードを使用して、固定サイズ 32 の 16 進文字列を 16 バイトの uint8 配列に変換しています。
const uint8_t* c = "0123456789abcdef0123456789abcdef";
uint8_t Bytes[16];
for (int i = 0; i < 16; i++) {
sscanf (&c[2*i], "%2hhx", &(Bytes[i]));
}
ターゲット幅を 1 バイトに指定しているにもかかわらず、hh
ステップごとに 4 バイトが書き込まれます。したがって、コードはバッファの末尾から 3 バイトを書き込みます。何故ですか?
(今のところ、各ステップで配列にコピーされる一時的な int を使用して修正しました。)
再現するには:
#include <stdint.h>
#include <string>
void main (int argc, char* argv[])
{
const char* c = "0123456789abcdef0123456789abcdef";
uint8_t b[20];
for (int i = 0; i < 20; i++) {
b[i] = i;
}
for (int i = 0; i < 16; i++) {
sscanf (&c[2*i], "%2hhx", &(b[i]));
}
for (int i = 0; i < 20; i++) {
fprintf(stdout, "%02x\n", (int)(b[i]));
}
}
予想される出力は 01 23 45 67 89 ab cd ef 01 23 45 67 89 ab cd ef 10 11 12 13 です。
ただし、Visual Studio 2010 を使用した実際の出力は次のとおりです。
01 23 ... cd ef 00 00 00 13