第五篇:主机字节序与网络字节序的转换
2017-01-29 12:01
447 查看
前言
我们知道,数据在主机内的存放有两种模式,也就是说,主机字节序有两种:大端和小端( 这里假定读者已经清楚这个问题 )。但在网络通信中,要求通信数据( 通信数据这里指IP号和端口号 )的使用必须用网络字节序。什么又是网络字节序?网络字节序可以理解为主机字节序的大端模式。如果你的主机字节序原本就是大端模式,那么你可以考虑不用将通信数据转换为网络字节序;但如果你的主机字节序是小端,那么通信数据必须被下面提及到的其中某个函数进行处理,转换成网络字节序后方可使用( 即存放进套接字地址结构变量 )。
查看主机字节序
运行下面一段小程序即可查看你的主机字节序( 注释略 )#include <stdio.h> int main(int argc, char **argv) { union { short s; char c[sizeof(short)]; } un; un.s = 0x0102; if (un.c[0] == 1 && un.c[1] == 2) { puts("字节序为小端"); } else if (un.c[0] == 2 && un.c[1] == 1) { puts("字节序为大端"); } else { puts("字节序未知"); } return 0; }
本机运行情况:
转换函数
以下几个转换函数均包含在头文件 netinet/in.h 中1. uint16_t htons ( uint16_t host16bitvalue )
将16位的主机字节序无符号整型变量转换为网络字节序格式
2. uint32_t htonl ( uint32_t host32bitvalue )
将32位的主机字节序无符号整型变量转换为网络字节序格式
3. uint16_t ntohs ( uint16_t net16bitvalue )
将16位的网络字节序无符号整型变量转换为主机字节序格式
4. uint32_t ntohl ( uint32_t net32bitvalue )
将32位的网络字节序无符号整型变量转换为主机字节序格式
说明
以上函数中" h "代表主机字节序;" n "代表网络字节序;" s "代表16位的无符号整型变量( 往往是端口 );" l “代表32位的无符号整型变量( 往往是Ipv4地址 )。相关文章推荐
- 网络字节序与主机字节序的转换
- 网络字节序与主机字节序的转换(htonl,htons,inet_addr,ntohl,ntohs,inet_ntoa)
- 关于网络字节序和主机字节序的转换
- API SOCKET基础(三)网络字节序与主机字节序的转换
- 网络字节序与主机字节序的转换
- c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换
- 网络字节序与主机字节序的转换 - HEN_MAN的专栏 - 博客频道 - CSDN.NET
- SOCKET 网络字节序与主机字节序及其相互转换
- 网络字节序与主机字节序的转换
- Python网络编程——主机字节序和网络字节序之间的相互转换
- 网络字节序与主机字节序的转换[转]
- API SOCKET基础(4)网络字节序与主机字节序的转换
- API SOCKET基础(三)网络字节序与主机字节序的转换
- 网络字节序与主机字节序的转换
- c语言中网络字节序和主机字节序的转换
- 关于网络字节序和主机字节序的转换
- 64位网络字节序与主机字节序转换 ;32位网络字节序与主机字节序转换;16位网络字节序与主机字节序转换
- 关于网络字节序和主机字节序的转换
- 网络字节序与主机字节序相互转换
- 主机字节序与网络字节序的转换:ntohl()与htonl()