【问题标题】:How to convert binary to hexadecimal string in C/glib?如何在 C/glib 中将二进制转换为十六进制字符串?
【发布时间】:2011-09-22 17:40:56
【问题描述】:

是否有将二进制(即字节数组或内存块)转换为十六进制字符串的通用方法或良好的公共领域代码?我有几个处理加密密钥和校验和的应用程序,我需要经常使用这个功能。我为此编写了自己的“快速而肮脏”的解决方案,但它仅适用于固定大小的二进制对象,我正在寻找更通用的东西。这似乎是一项非常平凡的任务,我相信应该有一些代码或库。请有人指出我正确的方向吗?

【问题讨论】:

  • 对不起我之前的错误答案。看看这里:stackoverflow.com/questions/2482211/…
  • 不一样。二进制是指一块内存,而不是二进制字符串。基本上我正在寻找与 hexdump 在 Linux 上的功能相同的功能。

标签: c glib


【解决方案1】:

这样的?

void print_hex(const char * buffer, size_t size)
{
    for (size_t i = 0; i < size; i++)
        printf("%02x", buffer[i]);
}

【讨论】:

  • 是的,这看起来不错。让我试一试。本质上我希望函数返回一个字符串,但这是一个很好的起点。谢谢。
  • 通过使用 sprintf、strcat 和朋友,将其扩展为输出到字符串缓冲区应该是微不足道的。祝你好运!
  • GLib 有g_strdup_printf(),它会为你分配一个适当大小的字符串缓冲区。可能有用。
  • 没错,但是由于数据数据块的大小是可变的,输出字符串也是如此,我可能会自己分配内存,然后使用g_sprintf() 来填充它。代码应该是微不足道的。感谢大家的帮助。
【解决方案2】:

感谢大家的帮助。以下是最终代码以 glib 表示法的结果:

gchar *
print_to_hex (gpointer buffer, gsize buffer_length) {
    gpointer ret = g_malloc (buffer_length * 2 + 1);
    gsize i;
    for (i = 0; i < buffer_length; i++) {
        g_snprintf ((gchar *) (ret + i * 2), 3, "%02x", (guint) (*((guint8 *) (buffer + i))));
    }
    return ret;
}

【讨论】:

  • 为什么要使用移植性较差的 glib 函数和类型?这里没有什么是使用标准 C 无法完成的。
  • @harald:我理解你的观点,这是完全有效的。简短的回答是——为了一致性。此函数将进入实用程序库,并且大多数其他函数都是 glib 特定的,因此我们针对这种情况的策略是在整个库中仅使用 glib 类型。
  • 这是一个完全正当的理由 :)
猜你喜欢
  • 2017-02-23
  • 2014-08-03
  • 2012-01-22
  • 2018-01-31
  • 2020-01-04
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多