我不敢相信在GLib中没有API来做到这一点,现在我只能找到人们做自己的转换,比如here和here (function named "decode")。我真的很想在一个简单的GLib调用中找到一种方法,但是如果没有办法,上面的方法不适用于我,因为前者是C++(我使用C/GObject),而后者似乎并不完美(我对结果的长度有问题)。GLib API将十六进制字符串转换为ASCII字符串?
TIA
我不敢相信在GLib中没有API来做到这一点,现在我只能找到人们做自己的转换,比如here和here (function named "decode")。我真的很想在一个简单的GLib调用中找到一种方法,但是如果没有办法,上面的方法不适用于我,因为前者是C++(我使用C/GObject),而后者似乎并不完美(我对结果的长度有问题)。GLib API将十六进制字符串转换为ASCII字符串?
TIA
如上所述,这是有点不常见的。如果您有足够短的十六进制字符串,则可以用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;
}
'retval'可能不是空字符终止,然后不指向字符串。 – chux
我不是100%肯定你所说的“十六进制字符串”的意思,但可能是this thread会有一定的帮助。
你能澄清“似乎并不完美(我有问题的结果长度)”吗? – glglgl
你的工作假设这是一项常见任务。不是,程序的用户通常不熟练或不能输入十六进制字符串。二进制到十六进制比较常见,你的调试器知道如何做到这一点。离开机器一会儿。 –