是否具有将点分十进制表示形式的IPv4地址(例如“ 192.168.0.1”)转换为十进制值的功能?
有几个与此类似的问题,但是所有问题都在寻找或有答案,其中涉及编写解决问题的功能。我正在寻找库中的现有功能。
答案 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;
}