大端字节序就是在内存中先存储数字的高位,这样数字的高位就存储在了内存的低地址处,小端字节序就是在内存中先存储数字的低位。
socket可以实现异构系统间通信,不同的硬件平台对整数的存放形式是不一样的,有的采用大端字节序,有的采用小端字节序。这时候必须统一字节序,统一的字节序称为网络字节序,先将发送方主机上的字节序转换为网络字节序,接收方收到后再转换为自己的字节序。
补充:x86或80x86是intel首先开发制造的一种微处理器体系结构的泛称,而基于这种微处理器体系结构搭建起来的硬件平台就成为x86平台,windows和linux都是基于x86平台的。
补充:%0x和%x都是以十六进制格式输出
vim是vi的升级版本
把32位的主机字节序转换为网络字节序
把16位的主机字节序转换为网络字节序
把32位的网络字节序转换为主机字节序
把32位的网络字节序转换为主机字节序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <stdio.h> #include <arpa/inet.h> int main() { unsigned int x = 0x12345678; unsigned char* p1 = (unsigned char*)&x; printf("%0x %0x %0x %0x\n", p1[0], p1[1], p1[2], p1[3]); unsigned int y = htonl(x); unsigned char* p2 = (unsigned char*)&y; printf("%0x %0x %0x %0x\n", p2[0], p2[1], p2[2], p2[3]); return 0; }
|
输出结果是
78 56 34 12
12 34 56 78
老版本的转换函数
1 2 3 4 5 6 7 8 9
| inet_aton、inet_aton、inet_ntoa在点分十进制(如206.168.112.96)与它长度为32位的网络字节序二进制值间转换IPv4地址 #include "arpa/inet.h" int inet_aton(const char *strptr,struct in_addr *addrptr); in_addr_t inet_addr(const char *strptr); char *inet_ntoa(struct in_addr inadrr);
|
现在使用inet_pton和inet_ntop函数
inet_pton 和 inet_ntop 这两个函数是随IPv6出现的新函数,对于IPv4地址和IPv6地址都适用。目前更多的是用这两函数进行地址转换。