-1
如果我有下面的C数组:Ç十六进制字符数组字符串表示
char arr[4];
arr[0] = 0x11;
arr[1] = 0xc0;
arr[2] = 0x0c;
arr[3] = 0x00;
如何,如下所示的上述数据被转换成一个字符串?
char* str = "11c00c00";
如果我有下面的C数组:Ç十六进制字符数组字符串表示
char arr[4];
arr[0] = 0x11;
arr[1] = 0xc0;
arr[2] = 0x0c;
arr[3] = 0x00;
如何,如下所示的上述数据被转换成一个字符串?
char* str = "11c00c00";
int main()
{
char arr[4];
arr[0] = 0x11;
arr[1] = 0xc0;
arr[2] = 0x0c;
arr[3] = 0x00;
size_t len = sizeof(arr)/sizeof(*arr);
char* str = (char*)malloc(len * 2 + 1);
for (size_t i = 0; i < len; i++)
{
const static char table[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c','d','e','f' };
unsigned char c = (unsigned char)(arr[i]);
unsigned int lowbyte = c & 0x0f;
unsigned int highbyte = (c >> 4) & 0x0f;
str[2 * i] = table[highbyte];
str[2 * i + 1] = table[lowbyte];
}
str[2 * len] = '\0';
printf("%s\n",str);
return 0;
}
转换每个字符为无符号的字符(所以将0xC0不为负),然后将其转换成一个整数,并输出作为一个两位数十六进制值。
#include <stdlib.h>
#include <stdio.h>
#define INT(x) ((int)(unsigned char)(x))
int main()
{
char arr[4];
arr[0] = 0x11;
arr[1] = 0xc0;
arr[2] = 0x0c;
arr[3] = 0x00;
char *str;
str=malloc(32);
sprintf(str, "%02x%02x%02x%02x",
INT(arr[0]), INT(arr[1]), INT(arr[2]), INT(arr[3]));
puts(str);
}
输出是:
11c00c00
我试图理解你的代码。你能解释为什么你做'c&0x0f'和'(c >> 4)&0x0f'?谢谢。 – Jake
'c&0x0F'是“计算c表示的字节值的低4位”。这会产生0-15之间的值。类似地,'(c >> 4)&0x0f'是“计算c的高4位”。 Google为“c位掩码教程”和“c bitshift教程”。很多很好的网站来解释这个东西。 – selbie