我写了以下内容,以便在contiki中打印mote的ipv6地址 -
static void
print_ipv6_addr(const uip_ipaddr_t *ip_addr) {
int i;
for (i = 0; i <= 7; i++) {
printf("%04x ", ip_addr->u16[i]);
}
}
我的方法打印 -
aaaa 0000 0000 0000 1202 0174 0100 0101
而cooja显示的IP地址为 - aaaa::212:7401:1:101
。
我知道0000 0000 0000
与::
相同,但为什么其余部分会出现“乱码”?我在这里做错了什么?
答案 0 :(得分:4)
这是一个endianness问题。 uip_ipaddr_t
类型是一个使用网络字节顺序(即大端字节顺序)存储IPv6地址的联合,而您的平台显然是小端。
要在每个平台(包括您的平台)上正确打印地址,您应该使用其ip_addr
数据成员访问u8
变量,如下所示:
static void
print_ipv6_addr(const uip_ipaddr_t *ip_addr) {
int i;
for (i = 0; i < 16; i++) {
printf("%02x", ip_addr->u8[i]);
}
}
答案 1 :(得分:2)
Contiki包含void uip_debug_ipaddr_print(const uip_ipaddr_t *addr);
功能,可以为您完成任务:
#include "uip.h"
#include "uip-debug.h"
...
uip_ipaddr_t addr;
uip_ip6addr_u8(&addr,
0xaa, 0xaa, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x02, 0x12, 0x74, 0x01,
0x00, 0x01, 0x01, 0x01);
uip_debug_ipaddr_print(&addr);
putchar('\n');
输出:
aaaa::212:7401:1:101
在Contiki中还有uiplib_ip6addrconv
函数具有反函数(它从字符串构造IPv6地址对象)。
此外,还有官方指南如何打印IPv6地址,您可能需要阅读它们:http://tools.ietf.org/html/rfc5952