大端模式和小端模式详解

大端模式和小端模式详解怎么去理解大端和小端 大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式 总结如下 大端模式 低地址对应高字节小端模式 低地址对应低字节不管是大端还是小端模式 我们在读取和存储数据的时候一定都是从内存的低地址依次向高地址读取或写入 打个比方 我们定义一个数组 chararray 5 0 1 2 3 4 学习过 C 语言应该都知道 array 是这个数组存

怎么去理解大端和小端?

1、大端和小端核心是什么?

大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下:

大端模式:低地址对应高字节

小端模式:低地址对应低字节

不管是大端还是小端模式,我们在读取和存储数据的时候一定都是从内存的低地址依次向高地址读取或写入。

2、什么是存储顺序?

打个比方,我们定义一个数组,char array[5] = {0,1,2,3,4};

学习过C语言应该都知道,array是这个数组存储的首地址,如果这个您也不知道,那我还是建议你去复习一下C语言,这是C语言最基本不过的内容了。

数组存储的内存分布如下:

存储地址

0x2000 3001

0x2000 3002

0x2000 3003

0x2000 3004

0x2000 3005

存储的值

0

1

2

3

4

 

不管是写还是读,我们都是只要根据这个首地址就能找到我们想要的元素内容,从这一点上讲,在存储的时候,我们依次去存储01234。在读取的时候,我们也是从array[0]开始,依次读取01234



3、大端模式向小端模式发送数据

有了数据按照字节依次由低往高读取或存储这个前提,下面举例说明大端和小端的区别。

假设A要发送四字节的数据给BA的存储是按照大端模式,B的存储模式为小端模式。

A的存储1234内存分布如下图

存储地址

0x2000 4001

0x2000 4002

0x2000 4003

0x2000 4004

存储的值

0x12

0x34

0x56

0x78

 

因为A存储是按照大端模式,依据低地址对应高字节的规律,那么A要发送值int Value_A = 0x

 

Value_A将会由低地址依次发送给B,这里为什么是低地址,因为发送的开始,就是去读取数据,读取数据一定是从低地址开始读取得,那么B依次接收的值为0x120x340x560x78

 

B将接收到的值存储在如下图的内存中,存储的时候也是按照低地址往高地址开始依次存储

存储地址

0x2000 8001

0x2000 8002

0x2000 8003

0x2000 8004

存储的值

0x12

0x34

0x56

0x78

 

B接收完毕后,需要将内存中的值读取到Value_B中来,那么Value_B的值是多少呢?

B的存储是按照小端模式存储,低地址对应的低字节,那么int Value_B = 0x

 

这里可能很多人会有疑问?不是读取是按照低地址从高地址依次读取的吗?为什么相同的存储,读出来的值却不一样了?

这里就是关键了。在读取0x12出来后,系统设定的模式是低地址对应低字节,我们的Value_B

int类型,是四个字节的数据,展示在我们面前的数据,一定是从左到右字节的顺序依次降低的,所以将0x12放在最低的字节,如下图。

字节顺序

4

3

2

1

对应的字节的值

0x78

0x56

0x34

0x12

 

Value_B = 0x;

 

Value_A 不等于Value_B,这就是为什么我们在网络通信的时候一定要进行字节序和确认了,必须保证AB的字节序相同,如果不同,就需要使用字节序的转换函数。



4、字节序转换函数

1、htons unsigned short类型从主机序转换到网络序host to network short)
2htonl unsigned long类型从主机序转换到网络序(host to network long)
3ntohs unsigned short类型从网络序转换到主机序(network to host short)
4ntohl unsigned long类型从网络序转换到主机序(network to host long)


 

主机字节序一般都是小端(绝大多数,少部分也是大端存储的),网络字节序是大端存储的。

 

5、小端转大端函数讲解和原理分析

下面是一个将小端转化为大端的函数:

UINT32  LE2BE(UINT8 *dat,UINT8   len)

{

UINT32  temp=0,fact=1;

UINT8     i=0;

for(i=0;i

{

temp+=dat[i]*fact;

fact*=256;

}

return temp;

}

这段程序是什么意思呢?

我们还是举例说明。

在上面的案例中,如果B要给A发送int test_B = 0xB的存储就是小端模式,B要将0x正确的发送给A,那么按照上面的发送和接收,A是不会接收到0x的。

A会依次接收到0x78,0x56,0x34,0x12,不经过转换,低地址对应高字节,test_A = 0x

这里就需要按照上面进行转换。

上面的程序意图如下:

temp = 0x78*1 + 0x56*256 + 0x34 * 256*256 + 0x12*256*256*256

     = 120+22016++

     =

     = 0x

经过转换,A获取的值就是temp值,也就是B传送过来的值了。

 

看到这里,就算是把大端和小端的问题说明白了,实际上的问题核心就是一个是字节顺序,一个存储顺序。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212327.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午8:18
下一篇 2026年3月18日 下午8:18


相关推荐

  • 用picdoc做科研绘图可解决gemini/banana用不了的问题

    用picdoc做科研绘图可解决gemini/banana用不了的问题

    2026年3月15日
    5
  • Java程序员如何从码农晋升为架构师,你跟架构师的差别在哪里?

    Java程序员如何从码农晋升为架构师,你跟架构师的差别在哪里?一、如何定义架构师Java架构师,首先要是一个Java程序员,熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,怎么解决并发量、连接池,线程池。Java反射技术,写框架必备的技术,但是有严重的性能问题,替代方案Java字节码技术;nio,没什么好说的,值得注意的是”直接内存”的特点,使用场景;java多线程同步异步;ja…

    2022年7月8日
    85
  • 妙手跨境电商erp下载_跨境电商平台开源系统

    妙手跨境电商erp下载_跨境电商平台开源系统概述化繁为简的一站式跨境电商免费开源ERP管理平台,简洁的操作,助您高效工作。目前开源智造·Odoo跨境电商解决方案,默认标准支持如下电商平台:Amazon、eBay、WooCommerce、Shopify提升运营效率数据驱动,提升精细化运营能力与财务、供应链高效协同轻松掌控发展优化流程,把控风险,决策支撑解决财务痛点数据及时准确,提升财务效率告别繁琐对账功能特性产品管理智能,便捷、结构化…

    2026年1月29日
    6
  • PowerBI 引入时间智能

    PowerBI 引入时间智能

    2021年11月26日
    65
  • [Go] Go语言实现post请求时发送header头信息[通俗易懂]

    [Go] Go语言实现post请求时发送header头信息[通俗易懂]有些接口需要增加header头信息,里面传递token,这个时候就要求在post的时候能传递自己的header信息funcPostHeader(urlstring,msg[]byte,headersmap[string]string)(string,error){client:=&http.Client{}req,err…

    2022年7月16日
    37
  • 路由器04–OPKG

    路由器04–OPKG1.简介https://oldwiki.archive.openwrt.org/doc/techref/opkgOpkg是一个基于ipkg的轻量级的软件包管理系统,主要用于嵌入式系统,目前应用opkg的有OpenWRT和OpenEmbedded。1Opkg的详细使用方法可以参考OpenWRT的WIKI页面,不再赘述,本文将重点解释opkg的工作原理。…

    2022年5月20日
    312

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号