大小端字节序转换

在这里插入图片描述

特点

①各主机的字节序可能不同,网络协议指定的通讯字节序为大端。
②只有在多字节数据处理时才需要考虑字节序。
③运行在同一台计算机的进程互相通信时,不需要考虑字节序。

二、字节序转换函数

头文件:#include <arpa/inet.h>
①htonl函数(发送数据方使用)

32位:(IPv4字节序的转换)

uint32_t htonl(uint32_t host32bitvalue); 

功能:将32位主机字节序数据转换成网络字节序数据。
返回值:返回网络字节序的值。

②ntohl函数(接收数据方使用)

uint32_t ntohl(uint32_t net32bitvalue);     //返回主机字节序的值

功能:将32位网络字节序转换成主机字节序数据。
返回值:返回主机字节序的值。

16位(端口的转换)

③htons函数(发送方使用)

uint16_t htons(uint16_t host16bitvalue);    //返回网络字节序的值

功能:将16位主机字节序数据转换成网络字节序数据。

返回值:返回网络字节序的值。
④ntohs函数(接收方使用)

uint16_t ntohs(uint16_t net16bitvalue);     //返回主机字节序的值

功能:将16位网络字节序转换成主机字节序数据。
返回值:返回主机字节序的值。

总结:四个函数,如果主机和网络字节序相同,那么函数不会颠倒数据

二、新型网路地址转化函数

这两个函数是随IPv6出现的函数,对于IPv4地址和IPv6地址都适用,函数中p和n分别代表表达(presentation)和数值(numeric)。地址的表达格式通常是ASCII字符串,数值格式则是存放到套接字地址结构的二进制值。

① 将点分十进制的ip地址转化为用于网络传输的数值格式

int inet_pton(int family, const char *strptr, void *addrptr);    

参数:family 协议族
     strptr 点分十进制数串
     addrptr 32位无符号整数的地址

返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1

eg:

#include <stdio.h>
#include <arpa/inet.h>

int main()
{
	//点分十进制数串
	char *str_ip="172.20.10.1";
	//32位无字符串整型数据
	unsigned int num_ip=0;
	//AF_INET:IPv4  AF_INET6:IPv6
	inet_pton(AF_INET,str_ip,&num_ip);
	
	printf("转换前:str_ip=%s\n",str_ip);
	printf("转换后:num_ip=%u\n",num_ip);
	
	return 0;	
}

②将数值格式转化为点分十进制的ip地址格式

const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);     

返回值:若成功则为指向结构的指针,若出错则为NULL

eg:

#include <stdio.h>
#include <arpa/inet.h>

int main()
{
	//模拟一个32位网络字节序IP地址
	unsigned char p[]={192.168.0.1};
	
	char ip_str[16]="";
	inet_ntop(AF_INET,p,ip_str,16);
	printf("ip_str:%s\n",ip_str);
	
	return 0;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值