2017-01-22 57 views
-1

如果我有下面的C数组:Ç十六进制字符数组字符串表示

char arr[4]; 
arr[0] = 0x11; 
arr[1] = 0xc0; 
arr[2] = 0x0c; 
arr[3] = 0x00; 

如何,如下所示的上述数据被转换成一个字符串?

char* str = "11c00c00"; 

回答

1
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; 
} 
+0

我试图理解你的代码。你能解释为什么你做'c&0x0f'和'(c >> 4)&0x0f'?谢谢。 – Jake

+1

'c&0x0F'是“计算c表示的字节值的低4位”。这会产生0-15之间的值。类似地,'(c >> 4)&0x0f'是“计算c的高4位”。 Google为“c位掩码教程”和“c bitshift教程”。很多很好的网站来解释这个东西。 – selbie

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

相关问题