2013-07-09 153 views
2

我有一個字節數組,其中的值存儲爲16位無符號整數。這是分佈在我的字節數組中的兩個位置,即DataArray[11]DataArray[12]。我對包含字節數組的數據包的文檔告訴我,我需要提取的值最先打包最低有效位。我遇到了困難,我的頭繞着位掩碼和位移,而且我實際上不清楚是否需要使用其中一個或另一個。將2個8位字節陣列位置合併爲一個16位整數

這是我到目前爲止,但結果似乎並不正確:

int result = (DataArray[11] << 8 | DataArray[12]) & 0xFF; 
+0

「結果似乎不正確」並沒有告訴我們任何有用的東西。請給出一個樣本輸入和輸出的例子... –

+0

如果DataArray類型是字節,你可能會遇到向左移動8位的麻煩!!!在轉換之前將數組項目轉換爲無符號短整型。 – alexbuisson

+0

@alexbuisson:無論如何,字節都沒有移位運算符 - 它會自動提升爲「int」......並且在Java中沒有「unsigned short」類型。 –

回答

5

你正在試圖獲得一個16位整數,對不對?但是你使用& 0xff來屏蔽它 - 這限制了你的8位。我建議你掩蓋每個字節而不是結果:

int result = (DataArray[11] & 0xff) | 
      ((DataArray[12] & 0xff) << 8); 

我在這裏包括多個括號可能比需要,只是爲了理智的緣故,而不是需要擔心的優先級。

我也換了排序,這樣你轉移DataArray[12]而非DataArray[11],因爲它的意思是至少 -significant字節。

+0

如果由於符號擴展導致DataArray [12]爲負數,後者會給出錯誤的結果。另外,LSB首先意味着你必須交換陣列位置 – Joni

+0

@Joni:啊,關於第二種形式的好處。將刪除它並修復排序。 –

+0

非常感謝Jon Skeet,這似乎工作得很好。爲了正確理解,位掩碼0xFF確保我只從每個數組位置獲得我需要的內容,並且由於LSB,「<< 8」移位最後16位整數中的位,這是正確的嗎? – user2565357

相關問題