【问题标题】:Hex IP to Decimal IP conversion十六进制 IP 到十进制 IP 转换
【发布时间】:2015-08-10 18:16:20
【问题描述】:

如何转换一个十六进制ip(如42477f35),并让它吐出正确的十进制ip(在前面的例子中,正确的结果是66.71.127.53)?

我希望它将十六进制 ip 作为字符串输入,然后将正确的结果也输出为字符串,以便我可以在 C 代码的其他地方使用它。

我不是 C 方面的专家,所以如果有人能帮助我,将不胜感激。

【问题讨论】:

  • 用这个罐头句子系统地把球扔回提问者并没有真正帮助任何人。

标签: c


【解决方案1】:

您可以使用 sscanf 从原始字符串中选择十六进制作为整数,然后使用 sprintf 将它们以正确的格式放入另一个字符串中。

sscanf(hexipstring, "%2x%2x%2x%2x", &uint0, &uint1, &uint2, &uint3);
sprintf("%u.%u.%u.%u", uint0, uint1, uint2, uint3);

或者类似的东西。我从来都不确定scanf,所以请阅读一些手册页。 "%2x" 应该告诉 scanf 最多使用 2 个字符并将它们解释为十六进制数。

-edit:Caf 的代码更好,因为它检查 sscanf 中的错误并使用 snprintf 而不是 sprintf。更防错。用它代替我的。

【讨论】:

    【解决方案2】:

    这是一种可能性:

    #include <stdio.h>
    
    int ip_hex_to_dquad(const char *input, char *output, size_t outlen)
    {
        unsigned int a, b, c, d;
    
        if (sscanf(input, "%2x%2x%2x%2x", &a, &b, &c, &d) != 4)
            return -1;
    
        snprintf(output, outlen, "%u.%u.%u.%u", a, b, c, d);
        return 0;
    }
    

    【讨论】:

    • 这看起来很有希望。我会对此进行测试,然后回复您。
    • 这个snprintf(output, outlen, "%u.%u.%u.%u", a, b, c, d);应该是这个snprintf(output, outlen, "%u.%u.%u.%u", d, c, b, a);,因为IP是倒序的?
    • @kuchi:在这个问题中,IP 的十六进制和十进制版本的顺序相同 - 请参阅 OP 的示例。如果您看到“反向”IP,那么您可能直接在 little-endian 架构上打印网络字节顺序值。
    【解决方案3】:

    将十六进制 ip 拆分为八位字节(一次两个十六进制数字),并将每个八位字节转换为十进制整数。

    【讨论】:

    • 投反对票,因为我考虑过这一点,但不知道十六进制到十进制的转换部分
    猜你喜欢
    • 2015-06-29
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多