2013-10-24 45 views
0

我有一個設備,並且我有一些用戶在GUI中設置的值,如630330等。我需要將這些值傳遞給I2C字節。 583將以十六進制位爲02 47。這將是2個字節的變量,我需要調用Set(byte lower ,byte upper),以便將int或double值轉換爲2個字節是必需的。轉換爲低位和高位

我想:

  ushort R1x = (ushort)Rx; 
      byte upper = (byte)(R1x >> 8); 
      byte lower = (byte)(R1x & 0xff); 

我需要的是低= 47,上= 02

即給予lower = 0upper = 247 ..May我知道我做錯了什麼

+0

嘗試它爲'ushort Rx = 245 * 256 + 130;'並且正常工作。也許給更多的代碼? –

+0

我沒有得到你所說的。我實際上錯過了邏輯。 – Zigma

+1

你從16位值中獲取高8位和低8位的方法是正確的,但是你仍然得到錯誤的'lower'和'upper',IMO會出現一些令人意想不到的'R1x'值。 –

回答

1

它可以給你lower = 0upper = 247Rx = 247,因爲ushort是一個16位的值,而247適合8位。這就是爲什麼高8位爲零(不需要保持247),而低位保持整數,即247或00000000 11110111二進制。

,這將給你非零高位第一個數字是256(00000001 00000000),其中: -

upper = 1 
lower = 0 

要有upper = 47你需要扭轉的過程中,讓我們把它寫成一個8位二進制數:00101111。然後把這8位作爲16位數的高位:00101111 00000000。既然你想lower = 2我們需要把2放在正確的8位。這給出00101111 00000010二進制,它等於12034十進制。

不知道你在努力達到什麼目的,但是你提供的代碼Rx = 12034是唯一可能的上限和下限等於你想要的。所以如果這不符合你的協議,那麼你在其他地方犯了一個錯誤。

+0

+1。請參閱編輯的問題 – Zigma