如何将IPv4地址转换为十进制

时间:2018-07-31 11:33:08

标签: c

是否具有将点分十进制表示形式的IPv4地址(例如“ 192.168.0.1”)转换为十进制值的功能?

有几个与此类似的问题,但是所有问题都在寻找或有答案,其中涉及编写解决问题的功能。我正在寻找库中的现有功能。

3 个答案:

答案 0 :(得分:0)

C标准库没有这样的功能。很简单,这应该不成问题。这是一些使用strtoul()进行解析的示例代码:

int parseIpv4Address(uint32_t *addr, const char *addrStr)
{
    const char *p = addrStr;
    char *endp;

    unsigned long a = strtoul(p, &endp, 10);
    if (*endp != '.') return -1;
    unsigned long b = strtoul(p = endp+1, &endp, 10);
    if (*endp != '.') return -1;
    unsigned long c = strtoul(p = endp+1, &endp, 10);
    if (*endp != '.') return -1;
    unsigned long d = strtoul(p = endp+1, &endp, 10);
    if (*endp) return -1;

    *addr = (uint32_t) ((a << 24) | (b << 16) | (c << 8) | d);
    return 0;
}

unsigned long必须至少具有32个值位,因此这里的移位不需要特别注意(强制转换)。

它不会验证各个部分的范围,如果需要,您可以毫无问题地添加它。

答案 1 :(得分:0)

您可以使用类似inet_pton之类的东西,很容易使用,如下面的示例代码所示。

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(void)
    {
    struct in_addr result;

    if(inet_pton(AF_INET,"127.0.0.1",&result))
        {
        printf("%08x\n",result.s_addr);
        }
    else
        {
        printf("Failed\n");
        }
    return(0);
    }

该数字以网络字节顺序排列,但是如果要以主机字节顺序排列,则可以使用ntohl进行转换。

答案 2 :(得分:0)

事实证明Winsock 2提供了inet_addr()函数,该函数仅返回该地址的等效十进制值。

#include <stdio.h>
#include <winsock2.h>

int main(void)
{
    char* pAddr = "192.168.0.1";

    unsigned long value = inet_addr(pAddr);

    if (value == INADDR_NONE)
        printf("Invalid format of IP address");
    else
        printf("Decimal representation of %s is: %lu", pAddr, value);

    return 0;
}