【发布时间】:2017-09-25 15:34:35
【问题描述】:
我正在尝试将字符串格式的 IPv6 地址转换为 uint64_t 数据数组。为此我写了下面的程序
typedef struct
{
union
{struct in6_addr sa;
uint64_t addr[2];
}u;
} ipv6_addr_t;
ipv6_addr_t rnc;
char rncs[100] = "2000::200a";
inet_pton(AF_INET6, rncs, &(rnc.u.sa));
printf("%u\", rnc.u.addr[0]);
预期输出是地址的第一个 64 位,即 2^61 = 2305843009213693952。
但是当我执行程序时,我得到的输出为 32 这是 地址的第一个字节。
我不明白背后的原因,请帮忙。谢谢!
【问题讨论】:
-
A
struct in6_addr在结构的开头具有控制信息,位于保存地址的实际数据字节之前。看看它的大小;它不会是 16 个字节。 -
@JonathanLeffler,我认为您正在考虑
struct sockaddr_in6。根据the manual,struct in6_addr只是unsigned char数组的包装器。 -
%u可能是打印uint64_t的错误 printf 格式说明符。使用#include <inttypes.h>定义的PRIu64宏来获取正确的格式说明符,例如printf("%" PRIu64 " %" PRIu64 "\n", rnc.u.addr[0], rnc.u.addr[1]);。如果您没有#include <inttypes.h>,则可以使用printf("%llu %llu\n", (unsigned long long)rnc.u.addr[0], (unsigned long long)rnc.u.addr[1]);。 -
@JohnBollinger:用手机接听电话是有原因的。我当然想到了
sockaddr_in6结构。我没有检查过 POSIX 对这个话题有什么要说的。 -
即使使用PRIu64输出仍然是32
标签: c networking ipv6