【问题标题】:GLib API to convert hexadecimal string to ASCII string?GLib API 将十六进制字符串转换为 ASCII 字符串?
【发布时间】:2011-10-26 23:39:01
【问题描述】:

我不敢相信 GLib 中没有 API 可以执行此操作,目前我只发现有人在进行自己的转换,例如 herehere (function named "decode")。我真的很想在一个简单的 GLib 调用中找到一种方法来做到这一点,但如果没有办法,上述方法对我不起作用,因为前者是 C++(我正在使用 C/GObject)而后者似乎无法完美运行(我对结果的长度有疑问)。

TIA

【问题讨论】:

  • 您能否澄清“似乎无法完美运行(我对结果的长度有疑问)”?
  • 您的工作假设这是一项常见任务。不是,您的程序的用户通常不熟练或无法输入十六进制字符串。二进制到十六进制更常见一些,你的调试器知道怎么做。离开机器一会儿。

标签: c string hex ascii glib


【解决方案1】:

如前所述,这有点不常见。如果你有一个足够短的十六进制字符串,你可以在它前面加上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 不能以空字符终止,然后不指向字符串。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2013-02-07
    相关资源
    最近更新 更多