我正在尝试将ASCII字符串转换为十六进制格式的字符串,如下所示:
这是char数组:“0123456789ABCDEF”// Len = 16
这应该是输出字符:“0x30,0x31,0x32 ......”
我正在尝试这个:
unsigned char* ascii_char;
unsigned char output_char[16];
ascii_char = "0123456789ABCDEF";
int i = 0;
for (i = 0; i < 16; i++)
{
sprintf(output_char + i * 2, "%02X", ascii_char[i]);
}
但是期望的反应并不像预期的那样。因为如果我创建一个这样的变量:
unsigned char output_char[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};
工作正常。
答案 0 :(得分:3)
unsigned char output_char[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46};
与
完全相同 unsigned char output_char[] = "0123456789ABCDEF";
给出或者取一个从signed到unsigned char的转换,以及一个可以安全忽略的尾随零字节。
无需编写循环,调用printf()以及转换任何内容。
答案 1 :(得分:0)
您正在做的是获取一个已存储为十六进制的字符数组,并将其转换为十六进制代码的文本表示。
在循环结束时,output_char
看起来像这样:
"30313233343536373839414243444546"
或者至少如果阵列足够大以容纳它,但它只是所需大小的一半。您可以通过写过数组末尾来调用undefined behavior。
但是,ascii_char
已经已经以output_char
所需的格式。没有必要进行任何转换。