【转】字节序,大小端

字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。

其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。

在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于 TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。比如,以太网头部中2字节的“以太网帧类型”,表示后面数据的类型。对于ARP请求或应答的以太网帧类型来说,在网络传输时,发送的顺序是0x08,0x06。
栈底 (高地址)
---------------
0x06 -- 低位 
0x08 -- 高位
---------------
栈顶 (低地址)
该字段的值为0x0806。按照大端方式存放在内存中。

 

------------------------

|高地址:命令行参数和环境变量

----------------------- 0xC0000000 X86处理器
 | 栈底
 |
 |             栈
 |
 |
 |
\|/

NULL (空洞)

/|\
 |
 |
 |              堆

-----------------------
 未初始化的数据:由EXEC初始化为0或空指针 BSS
----------------(统称数据段)
初始化的数据
-----------------------  :由EXEC从程序读入
正文段(代码段)
----------------------- 正文段开始:0x08048000 X86处理器

 

 

现在我们弄清了高低地址,接着来弄清高/低字节,如果我们有一个32位无符号整型0x12345678(呵呵,恰好是把上面的那4个字节buf看成一个整型),那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。

高低地址和高低字节都弄清了。我们再来回顾一下Big-Endian和Little-Endian的定义:
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)

Little-Endian: 低地址存放低位
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
栈顶 (低地址)

在现有的平台上Intel的X86采用的是Little-Endian,而像Sun的SPARC采用的就是Big-Endian。

三、例子

嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。

例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址  存放内容
 0x4001    0x12
 0x4000    0x34

而在Big-endian模式CPU内存中的存放方式则为:

内存地址  存放内容
 0x4001    0x34
 0x4000    0x12
 
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址  存放内容
 0x4003     0x12
 0x4002     0x34
 0x4001     0x56
 0x4000     0x78
 
而在Big-endian模式CPU内存中的存放方式则为:

内存地址  存放内容
 0x4003     0x78
 0x4002     0x56
 0x4001     0x34
 0x4000     0x12

十进制至十六进制转换与大小端设置 大小端模式是计算机在多字节数据存储时采用的两种不同的存储方式。在不同的系统架构中,数据可以按照最高有效字节(Most Significant Byte, MSB)开始存储,这称为大端模式(Big-endian),或者按照最低有效字节(Least Significant Byte, LSB)开始存储,这称为小端模式(Little-endian)。在大端模式中,一个多位数的最高位字节存储在最低的内存地址处,向高位地址方向依次存储低位字节。 阅读详情

相关推荐

Geant4 学习笔记(一):实现multi-thread多线程

简单修改实现Geant4多线程

weixin_52417815的博客 6084

大小端高位低位字节的理解

一般左边为高位 右边为低位 一般一个16位(双字节)的数据,比如 FF1A (16进制) 那么高位字节就是FF,低位是1A 如果是32位的数据,比如 3F68415B 高位字(不是字节)是3F68 低位字是415B 右边是低位位,左边是高位 作者:亮亮_be3c 链接:https://www.jianshu.com/p/15a802e7669c ...

ALakers的博客 1万+

GD32F303定时器配置:实现两路互补PWM输出与相位控制

本文详细解析了基于GD32F303定时器实现两路互补PWM输出与精确相位控制的方法。通过配置TIMER2的中间对齐模式,结合REMAP功能解决引脚复用问题,从硬件层面稳定生成相位差180度的互补PWM信号,适用于电机驱动、开关电源等对时序要求苛刻的应用场景。

weixin_29182481的博客 304

关于数据中的高低位的理解

假设有这么一串数据 byte[]bytes={0x01,0x00}; 它的高位是 0x01 ,低位是 0x00; 它的高低位是以权位来区别的: Hex表示 0100 ; 以16进制看 16^3 16^2 16^1 16^0 4096 256 16 1 0 1 0 0 这样看起来可能会觉得不好看,用10进制代表16进制...

A2Z的博客 2万+

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 494

“风色幻想XX:交错轨迹游戏卡顿:从解决d3dx9_xx.dll缺失开始——风色幻想XX优化指南

《风色幻想XX:交错轨迹》作为一款深受玩家喜爱的角色扮演游戏,以其丰富的剧情、独特的角色设定和精美的画面赢得了广泛的赞誉。然而,在游戏过程中,部分玩家可能会遇到游戏卡顿的问题,这不仅影响了游戏体验,还可能让玩家错失精彩的剧情和战斗瞬间。在众多导致游戏卡顿的因素中,d3dx9_xx.dll文件的缺失往往是一个不容忽视的原因。

czl922的博客 1256

大端or小端

一、字节序定义字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和

flyfg的专栏 2757

YOLOv11改进 | 主干/Backbone篇 | 利用RT-DETR主干网络PPHGNetV2助力yolov11有效涨点(轻量化目标检测网络)

本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv11的主干,RT-DETR是今年由百度推出的第一款实时的ViT模型,其在实时检测的领域上号称是打败了YOLO系列,其利用两个主干一个是HGNet一个是ResNet,其中HGNet就是我们今天来讲解的网络结构模型,这个网络结构目前还没有推出论文,所以其理论知识在网络上也是非常的少,我也是根据网络结构图进行了分析(精度mAP提高0.05)。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备​目录一、本文介绍。

Snu77的博客 3719

高位和低位的概念

关于0x12345678在小端节序是先读78的解释:在小端字节序(Little-Endian)系统中,多字节数据的最低有效字节(Least Significant Byte, LSB)存储在最低的内存地址上,而最高有效字节(Most Significant Byte, MSB)则存储在较高的内存地址上。如果发送方和接收方使用了不同的字节序,那么在接收方收到数据后,通常需要将其从网络字节序(大端字节序)转换为主机字节序(可能是小端或大端),或者从主机字节序转换为网络字节序。,因为它是最低有效字节(LSB)。

Lzy1154119938的博客 1万+

基于网关实现不同网段S7-1200 CPU的通信方法

在A网段的计算机上ping B网段的计算机:在A网段的计算机上使用ping命令,向B网段的计算机发送数据包。在B网段的计算机上ping A网段的计算机:同样地,在B网段的计算机上使用ping命令,向A网段的计算机发送数据包。数据包也会经过路由器进行转发,最终到达A网段的计算机。配置路由器:在路由器上配置两个网段的IP地址和子网掩码,并设置路由表,使得路由器可以将A网段和B网段之间的数据进行转发。确定两个网络之间的路由器:假设需要将A网段和B网段进行通信,需要在A、B两个网段之间设置一台路由器。

电工 2399

操作系统实验一到实验九合集(哈工大李治军)

操作系统实验一到实验九合集(哈工大李治军) 有详细代码及注释,程序已在本地测试,均能跑通

leoabcd12的博客 5万+

【计算机基础】字节序

字节序 计算机最小的存储单位是 位(Bit),但是,计算机中最基本的存储单位是字节(Byte)。 1 Byte = 8 Bit 计算机在存储大于1字节的数据时,会将这个数据拆分为多个字节,再将它们按顺序存储起来,存储和读取这些字节的顺序,就是字节序。 定义 字节序(Endianness),即计算机在存储或读取数据时,字节的顺序。 分类 字节序分为 大端序(Big endian)和 小端序(Little endian)。 大端序:高位字节在前,低位字节在后。 小端序:低位字节在前,高位字节在后。

不定时分享与嵌入式有关的知识 9348

系统架构设计(以飞控系统、航电系统、机电管理系统、电子电气架构为例)

系统架构涉及对系统的结构和行为进行高层次的描述。它包括系统的组成部分、这些部分之间的关系、与外部环境的交互方式,以及满足特定功能和非功能性需求的方法。系统架构定义了系统的总体设计蓝图,指导系统的开发、集成、部署和维护。系统架构设计的目的是通过合理的结构和设计原则,确保系统能够高效、稳定、安全地运行,满足当前和未来的需求,同时具备良好的维护性、扩展性和可持续性。良好的系统架构不仅能够提高系统的开发效率和运行性能,还能降低长期的维护和运营成本,支持系统的持续演进和技术更新。

qq_41854911的博客 3052

Java字节序与大小端转换_字节序,大小端【转】

在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:big-edian和little-endian。字节顺序Endian现代的计算机系统一般...

weixin_31849853的博客 981

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C语言大小端字节序和浮点型转二进制总结

本文介绍了计算机数据存储中的两种字节序:大端序(高位字节存低地址)和小端序(低位字节存低地址),分析了两者在内存读取效率和直观性上的差异。同时探讨了类型转换时的截取规则和整型提升机制,并通过示例展示了数值溢出时的循环特性。文章还详细讲解了浮点数的二进制表示方法,包括IEEE754标准下的存储格式,以及浮点数精度限制导致的比较问题。最后指出浮点数不适合直接进行位运算和精确比较,建议采用差值比较法来避免精度误差。

2502_93550435的博客 603

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Go 语言中如何大小端字节序?int 转 byte 是如何进行的?

嗨,大家好!我是波罗学。。我们先看这样一个问题:“Go 语言中,将 byte 转换为 int 时是否涉及字节序(endianness)?我可以直接使用进行转换吗?这个问题非常简单,直接回答不涉及字节序,可以直接转换。但为什么呢?如果要彻底搞明白这个问题,还是要了解下字节序这个概念。接下来,让我带你深入地了解这个问题,以及如何在 Go 中如何处理字节序。

我是波罗学 1928

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java 网络字节序转主机字节序_关于字节序(大小端)的一点想法

今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下:为什么网络字节序(多数情况下)是大端?早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地址范围(IP地址是从前到后匹配的)。在性能不是很好的设备上,高字节在先确实是会更快一些。为什么主机字节序(多数情况下)是小端?小端的加法器比较好做,如果做一个8位*4的加法器,只需要一个8位加法...

weixin_31437187的博客 222

【转】C语言中的位域、字节序、比特序、大小端

1.比特序 / 位序 /bit numbering /bitendianness 我们知道一个字节有8位,也就是8个比特位。从第0位到第7位共8位。比特序就是用来描述比特位在字节中的存放顺序的。通过阅读网页http://en.wikipedia.org/wiki/Bit_numbering的内容,关于比特序我们得到下面的结论: (1)比特序分为两种:LSB 0位序和MSB ...

weixin_30678821的博客 415

位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)

1.比特序/ 位序 /bit numbering/我们知道一个字节有8位,也就是8个比特位。从第0位到第7位共8位。比特序就是用来描述比特位在字节中的存放顺序的。通过阅读网页的内容,关于比特序我们得到下面的结论:(1)比特序分为两种:LSB0位序和MSB0位序。LSB0位序是指:字节的第0位存放数据的,即我们的数据的最低位存放在字节的第0位。MSB0位序是指:字节的第0位存放,即我们的数据的最高...

weixin_34517026的博客 986

c++字符和字符串转整数类型及大小端

在网络传输中,很多数据都是按字节传递而不是字符串。最近就遇到了这个问题,在刚开始学c语言时都没有问题,可能太久不用了,记录一下 在报中文,用2个字节hex码来表示报文正文长度,什么是hex码呢 就是16进制数 char c = ‘\b’; 那么c的整数类型就是8(ascii 8对应\b) char类型是可以直接转int的 我犯得错误就是用atoi来转整形,aoti转的是字符串类型到整形 比...

weixin_34055910的博客 562

【转】[c/c++ ]字节序与大小端转换--不错

原文网址:http://blog.youkuaiyun.com/kuai0705/article/details/20841133 注明: 以下内容均为学习内容整理,记录,便于自己学习,并非完全意义上的自产,如有感到不适,请联系我   一.多字节值及字节序   1.brief   现在有一个数字 65430,这个数字在二进制的内存中一个字节无法完全存下,存储这个数字需要1个字节以上的空间。这样的...

weixin_34355881的博客 106

字节序(大小端)详解从高低地址和高低位开始理解(转)

字节序(大小端)详解从高低地址和高低位开始理解(转)   一、字节序定义 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。 其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。 在所有的介绍字节序的文章中都会提到字节序分为

humadivinity的博客 1万+

大小端字节序

大小端字节序 什么是大小端字节序 大端字节序:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 小端字节序:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 举个列子: 如果对&1进行强转char*,那么返回的首元素是在低地址处取得的,如果低地址取得值和低位的值相等则是小端字节序 #include<iostream> using namespace std; //判断大小端字节序 //1.指针强转 &1=0x00000001 01在低位 *s取得值是

weixin_45975835的博客 416

myprintf源代码 stm32_stm32与PC机的大小端、比特序的一致性问题

记今天心血来潮想把上学期末计划做的用STM32在LCD上播放Bad Apple,需要用到的东西包括:FatFs文件系统、LCD显示驱动,以及视频转二进制文件的工具。FatFs及LCD驱动都是直接拿教程的源代码改的(毕竟我懒,and时间也有限......),视频转二进制的工具是我上学期末写的一个脚本(Github:https://github.com/Floral/MyGadgets),今天遇到的问...

weixin_39860732的博客 135
上一篇: Alizee La isla Bonita MV
下一篇: 匹配一个或多个空格
「已注销」
博客等级 码龄19年 22粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值