版权归原作者所有,如有侵权,请联系我们

[科普中国]-有效字节

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

简介

在计算机科学中,有效字节一般是指计算机读取数据时,计数器所记录的计数值。如果在一个计数器中计数值的同时,又要往同一个计数器中写入新的计数值时,如果不注意先后顺序,很容易出错。所以有效字节也可以指最高有效字节和最低有效字节之间的字节。有效字节在计算机进行数据读取时很重要,特别是计算机进行网络数据传输时,定义有效字节有利于进行数据传输双方正确进行数据传输。

字节序现代的计算机系统一般采用字节(Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节序(Endianness),字节序是指处理器在处理多字节数据时,在寄存器和内存中保存字节的顺序。为了简便起见它的英文也常常表示为 Byte Order。

目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Little-Endian 和 Big-Endian。另外还有一种不常用的字节序Middle-Endian,又称为Mixed-Endian或者PDP-Endian,它是Little-Endian 和 Big-Endian的混合体。

我们常见的大部分处理器都采用Little-Endian,例如x86、6502、Z80、VAX以及PDP-11等;

使用Big-Endian的处理器通常是Motorola的处理器,例如:6800、68000、PowerPC 以及System/370等;像ARM、PowerPC、Alpha、SPARC V9、MIPS、PA-RISC和IA64等体系结构支持可切换的字节序这样的特性,这个特性可以提高效率或者简化网络设备和软件的逻辑。这种可切换的字节序被称为Bi-Endian,用于硬件上意指计算机或者传递数据时可以使用两种不同字节序中任意一种的能力。

Middle-Endian 使用很少,偶尔会在一些小型机体系中的十进制数的压缩格式中出现。

大和小端字节排序

|| ||

通常,您不必担心您通过网络发送和接收的数据的字节序列转换,但必须将字节顺序的情况。

当必须将字节顺序

需要在以下情况下转换字节顺序:

您需要通过网络传递的信息解释,而您发送到另一台数据相对的。例如,您可能将端口和网络地址,必须理解。

您进行的服务器应用不是 MFC 应用程序 (并在没有它的源代码)。此调用字节序列转换,如果两台计算机不共享同样字节顺序。1

最高有效字节与最低有效字节MSB(Most Significant Byte),最高有效字节,指多字节序列中具有最大权重的字节,2是一个数据中权值最大的那一个字节。

LSB(Least Significant Byte),最低有效字节,指多字节序列中最小权重的字节,3是一个数据中权值最小的那一个字节。

Big-Endian(BE),是指数据的高字节(MSB)保存在内存的低地址中,而数据的低字节(LSB)保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;Little-Endian(LE),是指数据的高字节(MSB)保存在内存的高地址中,而数据的低字节(LSB)保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

判断目标系统的字节序

/*return value 0 : TRUE (host boyte order is big-endian) 1 : FALSE */int isBigEndian(void){ union { int i; /* at least 16 bit */ char c; }un; un.i = 0x01; /* 0x01 is LSB */ return (un.c == 0x01);}网络中字节序转换

#include /* 将主机字节序,转换成网络字节序,返回网络字节序的值 */uint16_t htons(uint16_t host16bitvalue); /* convert short form host to net */uint32_t htonl(uint32_t host32bitvalue);/* 将网络字节序,转换成主机字节序,返回主机字节序的值 */unit16_t ntohs(uint16_t net16bitvalue);uint32_t ntohl(uint32_t net32bitvalue);