gpt4 book ai didi

使用 htonl(inet_addr(IP_str)) 将点分 IP 转换为整数返回 B 类和 C 类 IP 地址的负值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:59 28 4
gpt4 key购买 nike

我正在尝试使用 htonl(inet_addr(IP_str)) 将点分 IP 转换为整数.

问题是该函数对 B 类和 C 类的 IP 地址返回否定结果。

这是我的一些代码(简化):

int main() {
const char IP1[] = "10.0.0.0"; //Class A
const char IP2[] = "20.0.0.0"; //Class A
const char IP3[] = "126.0.0.0"; //Class A
const char IP4[] = "128.0.0.0"; //Class B
const char IP5[] = "160.0.0.0"; //Class B
const char IP6[] = "190.0.0.0"; //Class B
const char IP7[] = "193.0.0.0"; //Class C
const char IP8[] = "200.0.0.0"; //Class C

uint32_t integer_ip;
integer_ip = htonl(inet_addr(IP1));
printf("IP1: %s ------> Integer: %d\n",IP1,integer_ip);
integer_ip = htonl(inet_addr(IP2));
printf("IP2: %s ------> Integer: %d\n",IP2,integer_ip);
integer_ip = htonl(inet_addr(IP3));
printf("IP3: %s ------> Integer: %d\n",IP3,integer_ip);
integer_ip = htonl(inet_addr(IP4));
printf("IP4: %s ------> Integer: %d\n",IP4,integer_ip);
integer_ip = htonl(inet_addr(IP5));
printf("IP5: %s ------> Integer: %d\n",IP5,integer_ip);
integer_ip = htonl(inet_addr(IP6));
printf("IP6: %s ------> Integer: %d\n",IP6,integer_ip);
integer_ip = htonl(inet_addr(IP7));
printf("IP7: %s ------> Integer: %d\n",IP7,integer_ip);
integer_ip = htonl(inet_addr(IP8));
printf("IP8: %s ------> Integer: %d\n",IP8,integer_ip);
return 0;
}

结果:

IP1: 10.0.0.0 ------> Integer: 167772160   
IP2: 20.0.0.0 ------> Integer: 335544320
IP3: 126.0.0.0 ------> Integer: 2113929216
IP4: 128.0.0.0 ------> Integer: -2147483648
IP5: 160.0.0.0 ------> Integer: -1610612736
IP6: 190.0.0.0 ------> Integer: -1107296256
IP7: 193.0.0.0 ------> Integer: -1056964608
IP8: 200.0.0.0 ------> Integer: -939524096

我在一些在线工具上测试了结果,例如 this一个。

考虑这行输出:

IP5: 160.0.0.0 ------> Integer: -1610612736

-1610612736等于160.0.0.0 whiles 1610612736等于96.0.0.0.

对我来说最重要的要求是速度。我不想检查每个 IP 是否属于 A 类。

我该如何解决这个问题?

谢谢?

最佳答案

您的代码调用未定义的行为来将无符号整数打印为有符号整数。

要打印 stdint.h 类型,请参阅 inttypes.h。使用 PRIu32 宏打印一个 uint32_t:

uint32_t u = 42;
printf("Value: %" PRIu32 "\n", u);

如果 uint32_t 不是 typedef unsigned int uint32_t;,则不能保证标准 %u 转换类型指定器是正确的。例如,对于 32 位 longint,它可以被 typedefed 为 unsigned 中的任何一个。

对于十六进制,使用 PRIx32PRIX32

详情:

宏映射到带有适合您平台的转换说明符的字符串文字,可以是 "u"。请注意 % 必须在前面的部分给出。连接相邻字符串文字的标准 C 功能将生成最终的格式字符串。不会有运行时开销。

关于使用 htonl(inet_addr(IP_str)) 将点分 IP 转换为整数返回 B 类和 C 类 IP 地址的负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42393763/

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