C 十六进制IP到十进制IP转换

C 十六进制IP到十进制IP转换,c,C,如何转换十六进制ip(如42477f35),并使其输出正确的十进制ip(在前面的示例中,正确的结果是66.71.127.53) 我希望它将十六进制ip作为字符串输入,然后将正确的结果也作为字符串输出,这样我就可以在C代码的其他地方使用它 我不是C方面的专家,所以如果你们中有人能帮助我,我将不胜感激。将十六进制ip拆分为八位字节(一次两个十六进制数字),并将每个八位字节转换为十进制整数 这是一种可能性: #include <stdio.h> int ip_hex_to_dquad(c

如何转换十六进制ip(如
42477f35
),并使其输出正确的十进制ip(在前面的示例中,正确的结果是
66.71.127.53

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


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

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

这是一种可能性:

#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;
}
#包括
整数ip十六进制到四进制(常量字符*输入,字符*输出,大小\u t输出)
{
无符号整数a,b,c,d;
如果(sscanf(输入,“%2x%2x%2x%2x”、&a、&b、&c、&d)!=4)
返回-1;
snprintf(输出,输出,“%u.%u.%u.%u”,a、b、c、d);
返回0;
}

您可以使用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个字符,并将它们解释为十六进制数


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

向下投票,因为我考虑过这一点,但不知道十六进制到十进制的转换部分。用这个固定的句子系统地把球扔回询问者,对任何人都没有帮助。这看起来很有希望。我会测试一下,然后再给你回复。这个
snprintf(输出,输出,“%u.%u.%u.%u.%u”,a,b,c,d)如下
snprintf(输出,输出,“%u.%u.%u.%u”,d,c,b,a)因为IP的顺序是相反的?@kuchi:在这个问题中,IP的十六进制和十进制版本的顺序是相同的-参见OP的示例。如果您看到的是一个“反向”IP,那么您可能直接在一个小小的endian体系结构上打印一个网络字节顺序值。