2011-08-14 80 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會有一定的幫助。

相關問題