我不敢相信在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
你的工作假設這是一項常見任務。不是,程序的用戶通常不熟練或不能輸入十六進制字符串。二進制到十六進制比較常見,你的調試器知道如何做到這一點。離開機器一會兒。 –