我需要比较两个 IP。一个 IP 以 u8
格式存储,我设法将其转换为 char *
我存储在变量 arp_tbuf
中。但是,要比较的第二个 IP 是 u32
格式(来自 ip.h
)。但是每次我尝试将 u32
格式的 IP 转换为 char *
如下,
unsigned int pkt_da = (unsigned int)ip_header->daddr;
char pkt_tbuf[16];
char pkt_tbuf_tmp[4];
pkt_tbuf_tmp[0] = pkt_da & 0x000000FF;
pkt_tbuf_tmp[1] = (pkt_da & 0x0000FF00) >> 8;
pkt_tbuf_tmp[2] = (pkt_da & 0x00FF0000) >> 16;
pkt_tbuf_tmp[3] = (pkt_da & 0xFF000000) >> 24;
sprintf(pkt_tbuf, "%d.%d.%d.%d\n", pkt_tbuf_tmp[0], pkt_tbuf_tmp[1], pkt_tbuf_tmp[2], pkt_tbuf_tmp[3]);
我收到一个kernel panic
错误。
我知道 memcmp
与字符进行比较的功能。
如果各位专家能帮助我将此 IP 转换为 char *
并比较两个 IP,如 memcmp(arp_tbuf, pkt_tbuf)
.
非常感谢:)
编辑
正如@BobJarvis 所建议的,我在我的内核中再次运行了代码。 IT 可以很好地转换 LAN 中的 IP。但是,当我加载网页时,发生了 kernel panic
错误。我有更简洁的方法来执行从 unsigned int
到 char *
(点分 IP 格式)的 IP 转换吗?
最佳答案
我相信您遇到了超过 127 的值(IP 的任何 2 字节部分)的问题。>>>
运算符是一个算术移位(保留符号)转变而不是逻辑转变。 (参见 Shift operator in C )。您可以通过 pkt_da = 0x7f7f7f7f
和 pkt_da = 0x80808080
的简单测试在您的代码中看到这一点。打印值:
for (it = 0; it < 4; it++)
printf (" pkt_tbuf_tmp[%2d]: %u\n", it, pkt_tbuf_tmp[it]);
给予:
./bin/pktb 2139062143
pkt_tbuf_tmp[ 0]: 127
pkt_tbuf_tmp[ 1]: 127
pkt_tbuf_tmp[ 2]: 127
pkt_tbuf_tmp[ 3]: 127
Done - pkt_tbuf='127.127.127.127'
./bin/pktb 2155905152
pkt_tbuf_tmp[ 0]: 4294967168
pkt_tbuf_tmp[ 1]: 4294967168
pkt_tbuf_tmp[ 2]: 4294967168
pkt_tbuf_tmp[ 3]: 4294967168
Done - pkt_tbuf='-128.-128.-128.-128'
右移行为取决于编译器。因此,在一个盒子上有效的东西,可能不适用于另一个系统。
关于两个IP的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23847651/