2016-04-10 36 views
-4

我有STR:Ç - 字符到六

char *str = "lala"; 

现在,我想在STR转换任何字符为十六进制,例如:

str = convert(str); 
print str: 0x6C 0x61 0x6C 0x61 
      ^l^a^l^a 

我可怎么办呢?

回答

-2
char* x = str - 1; 
while(*++x) printf("%02x ", (int) *x); // Print one character in hex 
printf("\n") // Finish with a carriage return 
+1

这个代码是未定义行为。指针运算只在*数组内有效*(包括一次性结束指针)。 (然后,我希望人们停止使用增量子表达式,只是为了炫耀他们“知道C”。) –

+0

可以使用'char * x = str; while(* x)printf(“%02hhx”,* x ++);'并避免最初的'str-1'。 '(int)'没有用处。 – chux

+0

@KerrekSB在这个问题中,'str'指向一个字符数组。在我的回答中,'x'在不改变'str'的​​情况下迭代该数组。当它指向'str'的​​边界之外时,'x'不会被解引用。 – Logicrat

2
char *convert(char const *str) { 
    int len = strlen(str); 
    char *retVal = (char *)malloc(5 * len); 
    char *pos = retVal; 
    int i; 
    for(i = 0; i < len; ++i, pos += 5) sprintf(pos, i? " 0x%x" : "0x%x", str[i]); 
    retVal[5 * len - 1] = '\0'; 
    return retVal; 
} 

可能会错过一些东西,没有使用下八年。

2

只问printf的做到这一点:

void convert(char* str, size_t length) { 
    size_t i; 
    for(i = 0; i < length; i++) 
     printf("0x%02x ", str[i]); 
} 
0

您可以使用此实现实现它....

#define MAX 100 

char *convert(char *str) 
{ 
    char *hexStr = (char *)malloc(strnlen(str, MAX) * 5); 
    if (hexStr == NULL) 
     return NULL; 
    int i,j; 

    for (i=0, j=0; str[i]; j+=5, i++) 
     sprintf(hexStr + j, "0x%02x ", str[i]); 

    hexStr[--j] = '\0'; 

    return hexStr; 
} 
+0

缓冲区溢出的潜力:'sprintf()'会写入'0xNN \ 0',所以如果长度为2,那么它将分配10个字节,但它会写'0xNN 0xNN \ 0'(11字节)。除此之外,很好地完成:) –

+0

for循环不会将空字符写入缓冲区。语句hexStr [ - j] ='\ 0';在最后一个空格字符处写入空字符。所以,不应该发生缓冲区溢出。 – abhiarora

+1

'sprintf()'函数总是写入一个空字符。从C标准:除了输出写入数组(由参数指定)而不是写入流之外,'sprintf'函数等同于'fprintf'。在写入字符的末尾写入空字符; ...因此,当您使用'sprintf()'向缓冲区写入5个字符时,您还在末尾写入第6个字符:空字符。 –