endianness的正确定义是什么?

时间:2014-05-04 11:30:42

标签: computer-science modbus

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

起初我对这个措辞有点误导,因为CS教科书通常声明endianess与Byte Order有关。这也反映在一些库函数处理endianess的方式中:例如Python的struct.unpack库通过交换字节顺序来解包little-endian和big-endian值。

然而,对于这个特定的应用程序(即Modbus),endianess确实是指连续的16位寄存器(也就是字序)的顺序。

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

谢谢, 再见, 马可

2 个答案:

答案 0 :(得分:1)

原始标准从未定义过非16位整数数据的打包,因此您会发现不同的制造商已经以不同的方式实现了打包,包括如何打包4字节浮点数,以及包括浮点数使用点格式(IEEE-754或其他)。如果您尝试编写通用解决方案,则必须提供用户可设置或型号选项。如果您只是在做一次性解决方案,那么您已找到它。

答案 1 :(得分:1)

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

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

*(char*) &XYZ 

0xBE

 0xAF???

答案总是如此,它取决于PROCESSOR是否假定低位字节首先出现(little endian = 0xAF)或高位字节是否先出现(big endian = 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。

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