簡體   English   中英

Java中的24到32位轉換

[英]24- to 32-bit conversion in Java

我對一個名為OpenBCI的新物聯網項目感興趣 ,該項目基本上是一個用於讀取和處理腦電波和其他生物數據的開源腦電圖。 在他們的文檔中,他們聲稱通過空中傳輸的數據(通過RFDuino)發送24位數據。 要將24位值轉換為32位有符號整數,他們建議使用以下Java友好的處理代碼:

int interpret24bitAsInt32(byte[] byteArray) {
    int newInt = (
        ((0xFF & byteArray[0]) << 16) |
        ((0xFF & byteArray[1]) << 8) |
        (0xFF & byteArray[2])
    );

    if ((newInt & 0x00800000) > 0) {
        newInt |= 0xFF000000;
    } else {
        newInt &= 0x00FFFFFF;
    }

    return newInt;
}

我想我正在努力了解到底發生了什么。 讓我們來看看第一段代碼:

int newInt = (
    ((0xFF & byteArray[0]) << 16) |
    ((0xFF & byteArray[1]) << 8) |
    (0xFF & byteArray[2])
);
  • 為什么假設輸入中有3個字節是安全的?
  • 0xFF值有什么意義?
  • 左位移( << )的目的是什么?

第二部分也有點神秘:

if ((newInt & 0x00800000) > 0) {
    newInt |= 0xFF000000;
} else {
    newInt &= 0x00FFFFFF;
}
  • 為什么newInt & 0x00800000 0x00800000什么意義?
  • 為什么if-else基於上述操作的積極與非陰性結果?
  • 0xFF0000000x00FFFFFF什么意義?

我想這個功能只有很多手工和魔法,我想更好地理解!

為什么假設輸入中有3個字節是安全的?

24位/ 8位= 3個字節

0xFF值有什么意義?

這有點面具。 0b11111111二進制。 在這種情況下,它被用作將字節值轉換為int的快速方法。

左位移(<<)的目的是什么?

一旦在前一條指令中檢索到int值,它就會向左移16位以獲取int的第三個字節的位置(從右邊開始計數)。 這是由於字節數組以big-endian格式存儲字節,其中MSB首先出現。 下一個字節僅移位8位以占用第二個字節的位置,最后一個字節根本不需要移位,因為它已經在第一個字節點中。

為什么newInt和0x00800000? 0x00800000有什么意義?

0x80是獲得某個字節的MSB的另一個位掩碼。 0x00800000對應於第三個字節的MSB(即byteArray[0]中的字節,在前一個過程中向左移位了16位)。 這也對應於整個24位值的MSB。

為什么if-else基於上述操作的積極與非陰性結果?

確定24位值的MSB是1還是0將分別以二進制補碼表示法告訴我們它是負數還是正數。

0xFF000000和0x00FFFFFF有什么意義?

如果數字為24位表示為負,我們也希望它為負二進制補碼中的32位值,這就是為什么我們必須使用OR運算符用0b11111111 (0xFF)填充第4個和最后一個字節。
如果它已經為正,則第四個字節可以是0x00,后面的3個字節與原始的24位值相同 - 通過使用0x00FFFFFF屏蔽完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM