字节序

1.什么是字节序

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。由于数据在内存中存储的顺序与操作系统有关,因此字节在主机中的存储顺序通常称为主机序;而数据在网络中的存储顺序则称为网络序。

常见的字节序有:大端字节序(Big endian)与小端字节序(Little endian)。

主机序依CPU而定:Intel x86为Little endian,Motorola680x则是Big endian。

网络序与CPU无关都是Big endian, 这是因为统一字节序有利于数据在不同主机之间的传递。另外采用Big endian传输也是为了使重要的数据先传输,这样即使后面的低字节丢失,信息的失真度也会较小。

2.大端字节序(Big endian)

所谓大端字节序是指数据的高位存储在地址的低位,数据的低位存储在地址的高位。(高位低地址,低位高地址)

3.小端字节序(Little endian)

所谓小端字节序是指数据的低位存储在地址的低位,数据的高位存储在地址的高位。(低位低地址,高位高地址)

4.表现形式

以多字节数据0x12345678为例,假设该数据在CPU中的内存地址为0x1000,则大小端字节序模式下,各字节的存储地址为:

地址 大端 小端
0x1000 0x12 0x78
0x1001 0x34 0x56
0x1002 0x56 0x34
0x1003 0x78 0x12

5.意义

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

6.如何区分CPU是大端还是小端

在实际编程中,我们可以通过下面的代码段判断CPU是大端还是小端:

union
{
    short n;
    char ch[2];
}Endian = {0x1234};

#if (Endian.ch[0] == 0x12)
#define Big_Endian 1
#else
#define Big_Endian 0
#endif
时间: 2025-01-06 18:43:25

字节序的相关文章

字节序转换与结构体位域(bit field)值的读取 Part 2 - 深入理解字节序和结构体位域存储方式

上一篇文章讲解了带位域的结构体,在从大端机(Big Endian)传输到小端机(Little Endian)后如何解析位域值.下面继续深入详解字节序,以及位域存储的方式. (1) 我们知道,存储数字时,对小端机而言,数字的低位,存在低地址,高位存在高地址.大端机正相反. (2) 读取的方式,也是一样的.对于小端机,读出的低地址位作为数字的低位. (3) 此外Big-Endian/Little-Endian存储顺序,不仅仅针对字节,还针对字节内的比特位.对于小端机而言,字节内的8个比特,低地址端比

【Linux 网络编程】字节序和地址装换

(3)字节序    <1>大端字节序        最高的有效位存储于最低内存地址处,最低有效位存储于最高内存地址处.    <2>小端字节序        最高的有效位存储于最高内存地址处,最低有效位存储于最低内存地址处.  保存0x12345678       ----------------->内存地址增长的方向        12 34 56 78 大端字节序        78 56 34 12 小端字节序    <3>主机字节序        不同的主

c# 主机和网络字节序的转换 关于网络字节序和主机字节序的转换

最近使用C#进行网络开发,需要处理ISO8583报文,由于其中有些域是数值型的,于是在传输的时候涉及到了字节序的转换. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有两种字节顺序,根据他们所处的位置我们分别称为主机节序和网络字节序. 通常我们认为网络字节序为标准顺序,封包的时候,将主机字节序转换为网络字节序,拆包的时候要将网络字节序转换为主机字节序. 原以为还要自己写函数,其实网络库已经提供了. 主机到网络:short/int/long IPAddress.HostToNet

小端字节序与大端字节序

端模式分为:小端字节序和大端字节序,也就是字节在内存中的顺序. 小端字节序:低字节存于内存低地址:高字节存于内存高地址.如一个long型数据0x12345678 0x0029f458 0x78 0x0029f459 0x56 0x0029f45a 0x34 0x0029f45b 0x12 在以上数据存放于内存中的表现形式中,0x0029f458 < 0x0029f459 < 0x0029f45a < 0x0029f45b, 可以知道内存的地址是由低到高的顺序:而数据的字节也是由低到高的,

实现两个字节序的交换

实现两个字节序的交换例如:300=0X012C,交换之后为0X2C01 1 /******************************************************************************* 2 * Function Name : exchangeBytes 3 * Description : 模拟的htons 或者 ntohs,如果系统支字节序更改可直接替换成系统函数 4 * Input : value 5 * Output : None 6 *

内存对齐,大端字节 &nbsp; 序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是

对于字节序小端和大端的思考

最近公司处理器要换核,由小端处理器ARM换成大端处理器POWERPC,bootloader以及kernel的移植工作交给了我,这是一个很有挑战的工作,自己也非常兴奋. 如此一来,当今主流的嵌入式处理器(MIPS ARM PPC)也都算接触过啦. 这几天开始动手做移植,首先要解决的是大小端的差异,进过学习思考,感觉大小端还是很有研究的必要,自己的思考总结记录在此,与大家分享,以备后用. 从网上可以查到的大小端的解释,小端是低端数据存放在低端地址,大端是高端数据存在低端地址.大小端真的就这么简单吗,

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

字节序问题

1. 在设计计算机时,有两个不同的体系结构来处理内存存储区,他们被称为大字节序和小字节序.字节序是一个处理器架构特性,用于指示像整数这样大数据类型的内部字节顺序.几乎所有的机器上,多字节对象都被存储为连续的字节序列. 运行在同一台电脑上的进程在在英特尔的计算机上,低位字节被优先存储.这意味着像 0x1234 十六进制单词存储作为 (0x34 0x12) 在内存中.对于四个字节的值 :例如,0x12345678 将存储为 (0x78 0x56 0x34 0x12)."较大的一端在"这样做