我正在尝试在C ++(Windows)中将IPv4地址从std::string
转换为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;
我希望不是使用S_un_b
的{{1}}字段然后执行计算,我可以简单地使用sin_addr
字段。不幸的是,我得到了不同的价值观。
例如,对于字符串“192.168.1.1”:
S_addr
执行计算时,我得到了结果
3232235777(这是正确的值)S_un_b
中的值时,我得到了结果
16885952。我的问题是:
为什么会有区别?
我可以利用S_addr获得所需的值吗?
答案 0 :(得分:2)
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);