2010-09-21 24 views
2

我想和身體的方法:如何獲取兩個字節並將它們合併到C#中的單個UInt16中?

public UInt16 ReadMemory16(Byte[] memory, UInt16 address) 
{ 
    // read two bytes at the predefined address 
} 

所以,我想在內存[地址]下一個字節來獲取值,並將它們合併成一個UINT16。

對於字節的順序,我正在執行的機器是小尾數,如果有關係。如何獲得這兩個字節值並將它們組合到一個單獨的C#中的UInt16?

+0

究竟你*我執行的機器是小端的意思*?你的意思是內存數組中的字節順序總是小尾數?或者你的.NET程序運行的機器總是小端的?或者這兩個? – 2010-09-21 20:36:27

+0

@Mark Byers,我在模仿玩具機器。所以,我正在執行的機器永遠是小端。 – Froglox 2010-09-21 20:39:26

回答

7

使用位位移:

return (ushort)((memory[address + 1] << 8) + memory[address]); 

您可以使用BitConverter類,但要知道,有一個靜態只讀字段名爲IsLittleEndian,你在使用前應檢查。如果它已經設置爲little endian,那麼你可以使用這個類,但是如果它被設置爲錯誤的值,你不能修改它。

或者,您可以看看Jon Skeet的MiscUtil庫,它包含EndianBitConverter類,它允許您指定字節序。

+1

@馬克拜爾斯,這讓我感到困惑,因爲它似乎就像你在轉換之前留下了8個陣地。所以,一個字節(因爲內存是一個字節數組)正在被移動8個位置。如果這些位不是暫時性的,那麼它們在被移位時的位置在哪裏? – Froglox 2010-09-21 20:31:25

+1

@Froglox:Bitshift(和大多數其他操作)僅針對至少32位的整數定義。當你移位一個字節時,它首先被隱式地轉換爲一個int然後移位。如果你願意,你可以明確地寫出這個演員。 – 2010-09-21 20:32:53

+1

@Mark Byers,我現在看到啊。這是我混亂的根源。 – Froglox 2010-09-21 20:33:55

13

一種方法是使用BitConverter類:

public UInt16 ReadMemory16(Byte[] memory, UInt16 address) 
{ 
    return System.BitConverter.ToUInt16(memory, address); 
} 

這將根據機器上的本機字節序解釋字節。

相關問題