2011-08-14 81 views
2

我不敢相信在GLib中没有API来做到这一点,现在我只能找到人们做自己的转换,比如herehere (function named "decode")。我真的很想在一个简单的GLib调用中找到一种方法,但是如果没有办法,上面的方法不适用于我,因为前者是C++(我使用C/GObject),而后者似乎并不完美(我对结果的长度有问题)。GLib API将十六进制字符串转换为ASCII字符串?

TIA

+1

你能澄清“似乎并不完美(我有问题的结果长度)”吗? – glglgl

+1

你的工作假设这是一项常见任务。不是,程序的用户通常不熟练或不能输入十六进制字符串。二进制到十六进制比较常见,你的调试器知道如何做到这一点。离开机器一会儿。 –

回答

0

如上所述,这是有点不常见的。如果您有足够短的十六进制字符串,则可以用0x作为前缀并使用strtoll()。但是,对于任意长度的字符串,这里是一个C函数:

char *hex_to_string(const char *input) 
{ 
    char a; 
    size_t i, len; 
    char *retval = NULL; 
    if (!input) return NULL; 

    if((len = strlen(input)) & 1) return NULL; 

    retval = (char*) malloc(len >> 1); 
    for (i = 0; i < len; i ++) 
    { 
     a = toupper(input[i]); 
     if (!isxdigit(a)) break; 
     if (isdigit(a)) a -= '0'; 
     else a = a - 'A' + '\10'; 

     if (i & 1) retval[i >> 1] |= a; 
     else retval[i >> 1] = a<<4; 
    } 
    if (i < len) 
    { 
     free(retval); 
     retval = NULL; 
    } 

    return retval; 
} 
+0

'retval'可能不是空字符终止,然后不指向字符串。 – chux

0

我不是100%肯定你所说的“十六进制字符串”的意思,但可能是this thread会有一定的帮助。

相关问题