文档章节

大小端字节顺序

大海月升
 大海月升
发布于 2014/09/02 10:56
字数 1258
阅读 535
收藏 5

字节序的问题涉及硬件架构,目前主要是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?

 

为方便理解,摘了INTER手册中的一张图。呵呵。

 

 

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处

 

基于IAX86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。因而对WORD/DWORD/QWORD等多于1字节类型的数据,在这些嵌入式平台上应该变换其存储顺序。通常我们认为,在空中传输的字节的顺序即网络字节序为标准顺序,考虑到与协议的一致以及与同类其它平台产品的互通,在程序中发数据包时,将主机字节序转换为网络字节序,收数据包处将网络字节序转换为主机字节序。

 

用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

对于0x12345678,

Little endian:高地址<------->低:存储数据0x12 0x34 0x56 0x78

Big endian:   高地址<------->低:存储数据0x78 0x56 0x34 0x12

为什么要注意字节序的问题呢?当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。 

 

所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。 
判断小端还是大端规则的方法:
int x = 1; 
if(*(char *)&x == 1)    //取x指针强制转换为char*类型再取值,此时取到的值是int最低字节值 
    printf("little-endian/n"); 
else 
    printf("big-endian/n"); 

另外补充:

1.BIG-ENDIAN、LITTLE-ENDIAN是跟CPU有关的,每一种CPU不是BIG-ENDIAN就是LITTLE-ENDIAN。IA架构的CPU中是Little-Endian,而PowerPC 、SPARC和Motorola处理器。这其实就是所谓的主机字节序。而网络字节序是指数据在网络上传输时是大头还是小头的,在Internet的网络字节序是BIG-ENDIAN。所谓的JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。

2.所以在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,而接收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换。如果通信的一方是JAVA程序、一方是C/C++程序时,则需要在C/C++一侧使用以上几个方法进行字节序的转换,而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是BIG-ENDIAN,只要C/C++一侧能正确进行转换即可(发送前从主机序到网络序,接收时反变换)。如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。

本文转载自:

大海月升
粉丝 2
博文 18
码字总数 919
作品 2
南宁
私信 提问
深入浅出: 大小端模式

Writer :BYSocket(泥沙砖瓦浆木匠) 一、什么大小端? 大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之: 大端模式,是指数据的高字节保存在内存的低地址中,...

泥沙砖瓦浆木匠
2015/10/14
3.8K
10
字节序和大小端

字节顺序 字节顺序(Endian) 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。 计算机系统一般采用字节(Byte(8 bit ))作为逻辑寻址单位。当物理单位的长度大于1个字...

子韦一
2013/12/25
379
0
系统平台大小端问题

Internet上的数据以大端方式在网络上传输!!! 常见CPU及大小端 CPU 操作系统 字节顺序 x86 (Intel、AMD等) 所有 little-endian DEC Alpha 所有 little-endian HP-PA NT little-endian HP-PA U...

满小茂
2016/04/02
220
0
Node.js - Buffer模块API整理

? 最近的几篇文章中都涉及到了, 虽然用过几个API, 还是系统总结一下, 主要针对API, 具体使用会少一点 Remote Procedure Call WebSocket协议以及ws源码分析 为什么使用? 在引入 TypedArray 之...

hsabalaaaC
06/28
0
0
最简单的方式教你理解大小端字节序

学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题。 什么是字节序? 字节序,简单来...

暮回_梓
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
25分钟前
2
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
36分钟前
2
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
37分钟前
2
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
43分钟前
6
0
IDEA 自定义方法注解模板

IDEA 自定义方法注解模板 1、使用效果 /*** 计算交易费用* @Author wangjiafang* @Date 2019/9/11* @param feeComputeVo* @return*/@PostMapping("/v1/fee_compute")public ApiResp......

小白的成长
43分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部