我正在使用此代码将固定大小为 32 的十六进制字符串转换为 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]));
}
尽管hh
指定了 1 个字节的目标宽度,但每步写入 4 个字节。因此,代码在缓冲区末尾写入 3 个字节。这是为什么?
(现在,我使用临时 int 修复它,该临时 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