2014-05-04 239 views
0

我发现自己最近摆弄了Modbus over IP,其中数据被存储并传输到16位寄存器中。 要编码大于16位的数据类型(例如32位浮点数),通常的方法是将32位值分成两个连续的16位寄存器(一对)。该标准的一些实现者选择将最重要的16位放在该对的第一个地址中,而其他一些则选择将其置于第二位。 这两种方法有时分别称为Big Endian和Little Endian。什么是endianess的正确定义?

起初我对这个措辞有点误导,因为CS教科书通常指出,字节顺序与字节顺序有关。这也体现在某些库函数处理字节顺序的方式上:例如Python的struct.unpack库通过交换字节顺序来解开小端和大端值。

然而,对于这种特定的应用(即Modbus),字节顺序确实是指连续的16位寄存器(也称为字顺序)的顺序。

那么,endianess的正确定义是什么? 它是否严格适用于字节顺序或任何其他大小的值被分割的块?

感谢, 再见, 马尔科

+0

字节,单词?不,“endianness”是关于煮鸡蛋开裂的起点。顺便说一句,维基说:“有些旧的ARM处理器具有一半的小端,一半的大端浮点数表示,用于双精度数字:这两个32位字都存储在小端,如整数寄存器,但最重要的第一个。“ –

回答

1

非16位整数数据的打包从未被原来的标准定义,所以你会发现,不同的厂商都执行了不同的方式包装,包括如何4字节浮点数被压缩,包括使用什么浮点格式(IEEE-754或其他)。如果您试图编写一个通用解决方案,您将不得不提供用户可设置的或型号,选项。如果您只是在做一次性解决方案,那么您已经找到了它。

1

我放大了以前。如果你有2(开始)字节的整数,

unsigned short XYZ = 0xBEAF ; // Ass-u-ming short is 2-bytes 

*(char*) &XYZ 

0xBE 

0xAF??? 

的回答总是,这取决于处理器是否假定低位字节优先(小端= 0xAF)或高端字节优先(大端= 0xBE)。从理论上讲,你可以拥有一个具有多个处理器(例如图形和CPU)的系统,这些处理器具有不同的字节顺序。

Motorola 68000芯片系列,SPARC和IBM 360/370是大端系统。英特尔8086,PDP-11和VAX是小端系统。

现在SPARC可配置为执行这两个操作。

Endianness is the byte order that the processor uses to interpret multi-byte data. 

Endianness适用于任何数字数据:整数,浮点数。

如果我有

unsigned long QXR = 0xDEADBEAF ; 

在你原来的问题是

*(无符号短)& QXR

0xDEAD 

0xBEAF ? 

的多个字节的排序总是与单个字节相同。在一个小端系统中它是0xBEAF,而在一个大端系统中是0xDEAD。

它不适用于单字节数据(字符串)。

相关问题