use*_*520 2 c networking winsock endianness
这是一个相当基本的问题,令我惊讶的是,我今天遇到了一个问题.
它看起来像inet_pton和inet_ntoa正在反转他们给出的IP地址的字节:
DWORD IP;
inet_pton(AF_INET, "192.168.0.1", &IP);
printf("%08X\n", IP);
Run Code Online (Sandbox Code Playgroud)
这将打印0100A8C0.好吧,如果我们分解字节,那就是
01.00.A8.C0 = 1.0.168.192.
同理:
IP = 0x7F000001;
struct in_addr ia;
ia.S_un.S_addr = IP;
printf("%s\n", inet_ntoa(ia));
Run Code Online (Sandbox Code Playgroud)
给了我1.0.0.127.
首先想到的是字节序,但我已经阅读了MSDN文档(1和2)并且没有提到字节顺序; 对我来说,这些函数会随意决定使用其中一种符号而没有明确说明这一点,这似乎很奇怪.
到底是怎么回事?
Endianness 是原因.
这些函数的重点不是产生一个"可读"的整数,而是设置一个准备好在线上传出的32位数量.IPv4需要大端排序,所以如果你这样做printf("%02X\n", ((char *)&IP)[0]));,我会打赌,你会得到C0.