小端

大端(Big Endian)与小端(Little Endian)详解

混江龙づ霸主 提交于 2020-12-05 02:24:17
大端(Big Endian)与小端(Little Endian)详解 发布时间:2008-01-01 18:24:00 来源: ChinaUnix博客   作者: ChinaUnix博客   点击:1494 【大端(Big Endian)与小端(Little Endian)简介】 Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order。 对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定: (1) 它的地址是多少? (2) 它的字节在内存中是如何组织的? 针对第一个问题,有这样的解释: 对于跨越多个字节的对象,一般它所占的字节都是连续的,它的地址等于它所占字节最低地址。(链表可能是个例外, 但链表的地址可看作链表头的地址)。 比如: int x, 它的地址为0x100。 那么它占据了内存中的Ox100, 0x101, 0x102, 0x103这四个字节(32位系统,所以int占用4个字节)。 上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定。 考虑一个W位的整数。 它的各位表达如下:[Xw-1, Xw-2, ... , X1, X0],它的 MSB (Most Significant Byte, 最高有效字节)为 [Xw-1, Xw-2, ... Xw-8]; LSB (Least

字节序(Endian),大端(Big-Endian),小端(Little-Endian)

被刻印的时光 ゝ 提交于 2020-12-05 02:02:29
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种: big-edian和little-endian。 字节顺序 Endian 现代的计算机系统一般采用 字节 (Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分 字节顺序 (Byte Order, or Endianness )。常见的字节顺序有两种: Big Endian (High-byte first)和 Little Endian (Low-byte first),这就是表2.1中的 BE 和 LE 。Intel X86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。举例来说,整型数字$ 1234ABCD 存储的时候就会有两种方式: 字节顺序 内存数据 备注 Big Endian (BE) 0xAB 0xCD 0x12 0x34 此时的0xAB被称为 most significant byte ( MSB ) Little Endian (LE) 0xCD 0xAB 0x34 0x12

网络通信之字节序转换原理与网络字节序、大端和小端模式

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-07 11:09:35
一、在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。 原因如下: 网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。 小 端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络 协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双方都正确的收发了数据。而相同平台进行通信时,如 果双方都进行转换最后虽然能够正确收发数据,但是所做的转换是没有意义的,造成资源的浪费。 而不同平台进行通信时必须进行转换 ,不转换会造成错误的收发数据,字节序转换函数会根据当前平台的存储模式做出相应正确的转换, 如果当前平台是大端,则直接返回不进行转换,如果当前平台是小端,会将接收到得网络字节序进行转换。 二、大端和小端 "大端"和"小端"表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序; 或者说: 1.小端法(Little-Endian)就是低位字节排放在内存的低地址端(即该值的起始地址),高位字节排放在内存的高地址端; 2.大端法(Big-Endian

【网络编程】大端模式和小端模式(大头序和小头序)

≡放荡痞女 提交于 2019-12-07 11:09:15
大端:多字节值的大端存储在该值的起始位置;(老大站排头为大) 小端:多字节值的小端存储在该值的起始位置;(老小站排头为小) 例如16bit整数:0x0102,其中01即为多字节值的大端,02即为多字节值的小端。 在网络中传输的都是大端序,但具体到某台主机CPU的实现,则有可能是大端序也可能是小端序。一般X86是小端。 那么,如何通过程序来判断当前主机到底是大端还是小端呢? /*判断大端还是小端, 1:小端 0:大端*/ int GetEndian() { union { int a; char b; } s; s.a = 0x0001; return (1 == s.b); } 联合体union的存放顺序是所有成员都从低地址开始存放,给s.a赋值为0x01,00为a的高端,01为a的低端,如果b==1,即a的低端位于起始位置,即小端,反之为大端。 我觉得《UNIX网络编程》(第一卷)给的例子更严密一些: /*判断大端还是小端, 1:小端 0:大端*/ int GetEndian() { union { short s; char c[sizeof(short)]; }un; un.s = 0x0102; if(2 == sizeof(short)) { if(1 == un.c[0] && 2 == un.c[1]) { printf("big-endian\n"); return