关于字节序(大端法、小端法)的定义
《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。
也可以说:
- 小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。
- 大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端。
举个简单的例子,对于整形0x12345678。它在大端法和小端法的系统内中,分别以如下所示的方式存放。
网络字节序
我们知道网络上的数据流是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢?
网络字节序定义:收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。
所以说网络字节序是大端字节序。
比如我们经过网络发送0x12345678这个整形,在80X86平台中,它是以小端法存放的,在发送前需要使用系统提供的htonl将其转换成大端法存放。
字节序测试程序
不同cpu平台上字节序通常也不一样,下面写个简单的C程序,它可以测试不同平台上的字节序。
#include <stdio.h>
#include <netinet/in.h>
int main()
{
int i_num = 0x12345678;
printf("[0]:0x%x\n", *((char *)&i_num + 0));
printf("[1]:0x%x\n", *((char *)&i_num + 1));
printf("[2]:0x%x\n", *((char *)&i_num + 2));
printf("[3]:0x%x\n", *((char *)&i_num + 3));
i_num = htonl(i_num);
printf("[0]:0x%x\n", *((char *)&i_num + 0));
printf("[1]:0x%x\n", *((char *)&i_num + 1));
printf("[2]:0x%x\n", *((char *)&i_num + 2));
printf("[3]:0x%x\n", *((char *)&i_num + 3));
return 0;
}
在80X86CPU平台上,执行该程序得到如下结果:
[0]:0x78
[1]:0x56
[2]:0x34
[3]:0x12
[0]:0x12
[1]:0x34
[2]:0x56
[3]:0x78
所以可知,在80X86平台上,系统将多字节中的低位存储在变量起始地址,使用小端法。htonl将i_num转换成网络字节序,可见网络字节序是大端法。
原文地址:http://www.blogjava.net/tinysun/archive/2009/12/31/307952.html
分享到:
相关推荐
通过这种方式,可以判断出当前运行环境是否为大端字节序系统或小端字节序系统,从而采取相应的字节序转换措施。 ### 结论 综上所述,字节序在计算机科学中是一个重要的概念,尤其是在涉及到跨平台编程和网络通信的...
它允许用户将4字节的二进制数据转换为浮点数,同时考虑了不同系统的大端和小端字节序问题。 浮点数在计算机内部是以二进制格式存储的,遵循IEEE 754标准,它定义了如何将浮点数转换成字节序列以及如何从字节序列...
"大端序和小端序" 大端序和小端序是计算机科学中的一种概念,用于描述多字节数据在内存中的存储顺序。这种顺序对于跨平台和网络程序非常重要,因为不同的平台和网络协议可能使用不同的字节序。 字节序可以分为两类...
该函数通过创建一个联合体,并在其中同时定义`unsigned int`和`unsigned char`类型的变量,然后将整型变量设置为1,检查联合体中字符型变量的值是否为1来判断当前系统是否为小端字节序。如果是,则返回1,否则返回0...
字节序转换辅助类,short大小端转换,ushort大小端转换,int大小端转换,uint大小端转换,long大小端转换,ulong大小端转换; short类型 小端转大端,short类型 大端转小端,int类型 小端转大端,int类型 大端转小端...
这里我们主要讨论两种字节顺序:大端字节序(Big-endian)和小端字节序(Little-endian)。这两个术语源自Gulliver's Travels中的两个部落名称,用来形象地描述数据在内存中的排列方式。 标题“Little_Big_endian....
大端模式(Big-Endian)和小端模式(Little-Endian)是两种不同的字节序,它们决定了多字节数据(如整数、浮点数)在内存中的存储顺序。理解这两种模式对于编写跨平台的软件,特别是在网络通信和嵌入式系统设计中至...
相反,小端模式,或称小端字节序,是将数据的最低有效位(LSB,Least Significant Bit)存储在内存的最低地址。在小端模式下,同样一个数值0x1122,0x22会被放在地址0x0010,0x11放在地址0x0011。小端模式更符合...
ARM架构处理器同时支持大端和小端字节序,但在实际应用中更倾向于使用小端字节序。这种灵活性使得ARM处理器能够适应不同的应用场景,无论是嵌入式系统还是高性能服务器领域,都能找到适合的字节序配置。 ### 字节序...
首先,我们要理解大端字节序和小端字节序的基本原理。在大端字节序中,最高有效字节存储在最低地址,而小端字节序则相反,最低有效字节存储在最低地址。例如,32位浮点数的二进制表示由一个符号位、8位指数和23位...
其中一个重要的问题是大端和小端字节序的问题。 大端和小端字节序是计算机科学中的一种约定,用于描述多字节数字在计算机中的存储顺序。其中,大端字节序(Big-Endian)是指高字节在内存中的地址较小,而低字节在...
总的来说,理解并能正确处理大端和小端字节序是每个IT专业人员的基本技能,尤其是在进行底层编程、嵌入式系统开发、网络编程等领域。`little_ending.zip`这个压缩包提供了一个实际的示例,帮助我们学习和测试如何...
综上所述,大端模式和小端模式作为两种基本的字节序,它们在计算机系统中的应用十分广泛。了解并掌握这些基础知识对于编写高效且兼容性强的代码至关重要。无论是进行网络编程还是处理多媒体数据,合理选择并应用正确...
在计算机科学中,大端字节序(Big-Endian)和小端字节序(Little-Endian)是两种主要的数据存储方式,对于理解和编写跨平台应用程序的开发者来说至关重要。这两种字节序涉及到如何在内存中存储多字节数据类型,如...
小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序。 也可以说: 1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端。 2.大端法(Big-...
例如,在小端字节序的系统中,整数数组中的每个元素将按照小端字节序来存储。 ### 五、Linux系统中的处理方法 为了确保数据在网络上传输时的正确性,Linux系统提供了以下四个宏来实现本地字节序和网络字节序之间的...
由于SHA1处理数据的方式是以字节为单位,并且需要考虑不同平台上的字节序问题,因此代码可能包含处理大端和小端字节序的代码。 `hash.exe`是一个可执行文件,可能是编译了`sha1.c`后生成的。这个程序很可能接受输入...
总的来说,这个压缩包提供了一个实践性的学习机会,帮助我们深入理解endianness的概念,并通过代码示例掌握如何在实际编程中处理大端和小端字节序的转换。这对于任何希望提升底层系统编程技能的人来说都是一个宝贵的...
计算机内部是以二进制形式存储数据的,对于多字节的数据类型(如32位浮点数),其字节的排列顺序有两种方式:大端模式(Big-Endian)和小端模式(Little-Endian)。大端模式是指最高有效字节(也称为高字节或MSB,...