2014-05-04 172 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。

它不適用於單字節數據(字符串)。

相關問題