GLib API 将十六进制字符串转换为 ASCII 字符串?

发布于 2024-11-29 07:38:58 字数 387 浏览 1 评论 0原文

我不敢相信 GLib 中没有 API 可以做到这一点,目前我只发现人们在做自己的转换,比如 此处此处(名为“解码”的函数)。我真的很想找到一种方法在简单的 GLib 调用中做到这一点,但如果没有办法,上述方法对我不起作用,因为前者是 C++ (我正在使用 C/GObject)而后者似乎工作不完美(我对结果的长度有问题)。

TIA

I cannot believe there is no API to do this in GLib, for now I have only found people doing their own conversion, like here and here (function named "decode"). I would really like to find a way to do this in a simple GLib call, but if there is no way, the above methods don't work for me because the former is C++ (I'm using C/GObject) and the latter doesn't seem to work perfectly (I'm having problems with the length of the result).

TIA

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

墨落成白 2024-12-06 07:38:58

如前所述,这有点不常见。如果您有足够短的十六进制字符串,则可以在其前面添加 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;
}

As mentioned, this is a bit uncommon. If you have a short enough hex string, you can prefix it with 0x and use strtoll(). But for arbitrary length strings, here is a C function:

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;
}
森林很绿却致人迷途 2024-12-06 07:38:58

我不是 100% 确定“十六进制字符串”是什么意思,但可能是 这个线程会有一些帮助。

I'm no 100% sure what you mean by "hexadecimal string" but may be this thread will be of some help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文