【发布时间】:2021-11-24 19:28:53
【问题描述】:
在下面的代码中,ip 的地址被转换为 uint8_t *。 但在下面再次转换的指针的每个索引都转换为 uint8_t。 为什么程序员会这样做?如果我们删除所有在初始演员表之后的演员表会有什么不同吗?此代码将 IPv4 IP 地址转换为 IP 号码。谢谢
uint32_t Dot2LongIP(char* ipstring)
{
uint32_t ip = inet_addr(ipstring);
uint8_t *ptr = (uint8_t *) &ip;
uint32_t a = 0;
if (ipstring != NULL) {
a = (uint8_t)(ptr[3]);
a += (uint8_t)(ptr[2]) * 256;
a += (uint8_t)(ptr[1]) * 256 * 256;
a += (uint8_t)(ptr[0]) * 256 * 256 * 256;
}
return a;
}
【问题讨论】:
-
ptr[i]对于任何有效索引i已经具有uint8_t类型。不需要单独的元素演员表。 -
如果这是 C++,那么这段代码中不应该有任何 c 风格的转换。请不要混淆 C 和 C++,它们是两种不同的语言。只标记两者的问题是关于两者的互操作
-
显示的代码通过 1) 将 IP 地址转换为 uint32_t,2) 将
uint32_t地址拆分为四个uint8_t值,以及 3) 使用它们创建相同的值来完成什么uint32_t开始时的值,在第 1 步?那应该完成什么?你的inet_addr真的接受 NULL 指针作为有效的输入参数吗? -
顺便提一下,
inet_addr被inet_pton取代。 -
作者可能应该检查
inet_addr的返回值是否有错误,并用uint8_t数组替换所有乱七八糟的东西,并调用ntohl()。