【数据存储】大/小端存储与字节顺序转换函数详解

学习目的是使用,网络编程主机字节顺序与网络字节顺序转换这块就用到了这些概念及其函数!

【Linux网络编程入门】Day5_socket编程基础

文章目录:

  1. 大端存储与小端存储
    1.1 低地址与高地址
    1.2 数据的高位与低位
    1.3 大端存储
    1.3.1 定义
    1.3.2 小端存储举例

  2. 小端存储
    2.1. 定义
    2.2 小端存储举例

  3. Linux网络通信
    3.1 四个函数存在的意义
    3.2. htonl())函数
    3.3. htons()函数
    3.4. ntohs()函数
    3.5. ntohl()函数

大端存储与小端存储

大端:将数据的低位字节放到高地址空间,高位字节放到低地址空间。地址由小向大增加,而数据从高位往低位放;
小端:将数据的低位字节放到低地址处,高位字节放到高地址处。高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致;
低地址与高地址
高地址:值较大的地址  
低地址:值较小的地址
注意:计算机读数据永远是从低地址开始的!!!

在这里插入图片描述

数据的高位与低位
数据的高位:数据左边位置的数
数据的低位:数据右边位置的数
数据的高位和低位又称高字节和低字节

在这里插入图片描述

大端存储
1. 定义
将数据的低位字节放到高地址空间,高位字节放到低地址空间。地址由小向大增加,而数据从高位往低位放;
2.小端存储举例
存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101
  • 存放的时是以一个存储单元为单位来存放
  • 读取从低地址读起!我们知道这是小端存储,所以在读出来的时候会从高位开始放

在这里插入图片描述
在这里插入图片描述

小端存储
1. 定义
将数据的低位字节放到低地址处,高位字节放到高地址处。高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致;
2.小端存储举例
  • 存放的时是以一个存储单元为单位来存放
  • 读取从低地址读起!我们知道这是小端存储,所以在读出来的时候会从低位开始放
存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Linux网络通信


参考链接:https://blog.csdn.net/m0_73825482/article/details/134315400

四个函数存在意义

为什么存在这个函数呢?或者存在这个函数的意义?(大端小端存储

先引入字节存放的两个概念一个是“大端顺序”,一个是“小端顺序”。俗称“小尾顺序”、“大尾顺序”。

简单的说就是对应数据的高字节存放在低地址,低字节存放在高地址上就是大端顺序;
对应数据的高字节存放在高地址,低字节存放在低地址上就是小端顺序。
比如 unsigned long hostlong = 0xa2b4c6d8;
大端顺序存放:
偏移地址       存放内容
0x00000000 0xa2
0x00000001 0xb4
0x00000002 0xc6
0x00000003 0xd8

小端顺序存放:
偏移地址      存放内容
0x00000000 0xd8
0x00000001 0xc6
0x00000002 0xb4
0x00000003 0xa2
同理推理16位数以及64位数。

一般地,在我的编译器里面设置的是小端顺序,这个可以根据自己的编译器看下设置,这里不深入说明。
但是网络传输数据采用的是大端顺序。
所以这才涉及到主机字节顺序和网络字节顺序,再说的详细一点,主机字节顺序可能是大端顺序或者小端顺序(这个要看编译器的设置,还有自己是用的C还是Java还是其他的语言,其各自都是不尽相同),但是网络字节顺序一定是大端顺序。
1. htonl()函数
原型:
	uint32_t htonl(uint32_t hostlong)
参数:
	hostlong:主机字节顺序表达的32位数
	htonl中的h–host主机地址,to–to,n–net网络,l–unsigned long无符号的长整型(32位的系统是4字节);
返回值:
	一个32位的网络字节顺序;
作用:
    将一个32位数从主机字节顺序转换成网络字节顺序。
2. htons()函数
原型:
	uint16_t htons(uint16_t hostlong)
参数:
	hostlong是主机字节顺序表达的16位数
	htons中的h–host主机地址,to–to,n–net网络,s–unsigned short无符号的短整型(32位的系统是2字节);
返回值:
	一个16位的网络字节顺序;
作用:
	将一个16位数从主机字节顺序转换成网络字节顺序,简单的说就是把一个16位数高低位呼唤。
3. ntohs()函数
原型:
	uint16_t ntohs(uint16_t netshort)
参数:
	netshort是网络字节顺序表达的16位数
	ntohs中的n–net网络,to–toh–host主机地址,s–unsigned short无符号的短整型(32位的系统是2字节);
返回值:
	一个16位的主机字节顺序;
作用:
	将一个16位数由网络字节顺序转换为主机字节顺序,简单的说就是把一个16位数高低位互换。
4. ntohl()函数
原型:
	uint32_t ntohs(uint32_t netlong)
参数:
	netlong是网络字节顺序表达的32位数
	ntohs中的n–net网络,to–toh–host主机地址,l–unsigned long无符号的长整型(32位的系统是4字节);
返回值:
	一个32位的主机字节顺序;
作用:
	将一个32位数由网络字节顺序转换为主机字节顺序。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值