gpt4 book ai didi

c++ - 使用 inet_pton() 获取 IPv4 地址的无符号整数表示

转载 作者:可可西里 更新时间:2023-11-01 11:51:05 25 4
gpt4 key购买 nike

我正在尝试将 IPv4 地址从 std::string 转换为它在 C++ (Windows) 中的 unsigned int 表示(根据 this )

我设法用下面的代码做到了这一点:

void strIPtoUnsignedIntIP(string ipStr){
struct sockaddr_in ip4addr;

ip4addr.sin_family = AF_INET;
inet_pton(AF_INET, ipStr.c_str(), &ip4addr.sin_addr);

unsigned int resIp = (ip4addr.sin_addr.S_un.S_un_b.s_b1 << 24) +
(ip4addr.sin_addr.S_un.S_un_b.s_b2 << 16) +
(ip4addr.sin_addr.S_un.S_un_b.s_b3 << 8) +
ip4addr.sin_addr.S_un.S_un_b.s_b4;
cout << resIp << endl;

}

我得到了正确的值,但是,下面这行不是那么优雅:

unsigned int resIp = (ip4addr.sin_addr.S_un.S_un_b.s_b1 << 24) +
(ip4addr.sin_addr.S_un.S_un_b.s_b2 << 16) +
(ip4addr.sin_addr.S_un.S_un_b.s_b3 << 8) +
ip4addr.sin_addr.S_un.S_un_b.s_b4;

我希望不要使用 sin_addrS_un_b 字段然后执行计算,我可以简单地使用 S_addr 字段。不幸的是,我得到了不同的值。

例如,对于字符串“192.168.1.1”:

  • 使用 S_un_b 执行计算时,我得到了结果3232235777(正确值)
  • 当简单地获取 S_addr 中的值时,我得到了结果16885952.

我的问题是:

  1. 为什么会有差异?

  2. 我可以利用 S_addr 获得所需的值吗?

最佳答案

根据MSDN doc for in_addr :

struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
};

所以你想要的只是 u_long 成员,按网络顺序(因为你希望 s_b1 是最高位字节):

unsigned int resIp = htonl(ip4addr.sin_addr.S_un.S_addr);

关于c++ - 使用 inet_pton() 获取 IPv4 地址的无符号整数表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29453117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com