簡體   English   中英

如何在Java中執行大端到小端字節交換

[英]how to do big endian to little endian byte swap in Java

我的數據以int形式存儲在java中。 <32位帶符號>,它表示始終為正的無符號16位值。

存儲為16位無符號十六進制字符0x00FD的Big Endian十進制253串行傳輸到
運行Android的Little Endian ARM,顯示為64768十進制,十六進制為0xFD00,所以我需要交換字節。

問題是應用程序位於主要使用簽名數據類型的JAVA中

Java字節定義為帶符號的8位Java整數定義為帶符號的32位

1   private void UI_Update_RunVars() {byte msb_byte1, lsb_byte2; int Swappedbytes;
2        String ONText;
3        msb_byte1 = (byte) mONTimeCount;
4        lsb_byte2 = (byte) (mONTimeCount>>8);
5        Swappedbytes = ((msb_byte1<<8) + lsb_byte2);
6        ONText = Convert2Time(Swappedbytes);
7        mTextON_Count.setText(ONText);  
8   } 

因此,在上面的示例中,我為十進制253大字節序發送了0x00FD,它在小字節序上為0xFD00到達,我調用方法UI_Update_RunVars();。 其中mONTimeCount = 0xFD00我需要交換字節以在調試器中在屏幕253上顯示一個十進制數字為“ 4 Minutes,13 Seconds”:

第3行執行為msb_byte1 = 0x00; 第4行執行為lsb_byte2 = 0xFD; 第5行是發生錯誤的地方,第5行在調試器中顯示為-3,這是正確的數學運算,但不是正確的答案。第5行-3的有符號32位整數顯示為十六進制0xFFFF_FFFD,我想要0x00FD

在對數據類型進行簽名時,如何執行無符號數學和字符串運算。

我的應用程序很簡單,采用UNSIGNED 16位數字並將其轉換為時間,以小時,分鍾,秒的形式

因此,只要未設置msb,以上代碼實際上就可以用於任何十六進制數字,

例如0x7F或以下的任何數字都可以工作,但是0x80或以上的任何數字都將失敗,因為msb是符號位。

使用字節實際上使它更加復雜。 您可以使用整數進行所有操作。 v為要轉換的值:

int swapped = ((v >> 8) & 0xff) | ((v & 0xff) << 8);

首先,我認為Integer.reverseBytes應該可以解決問題,但是共享代碼的實際問題是,我們將整數減小為字節,無論如何它都會變為負數。 相反,我們只能將計算保留在Integer中。

字節級別信息的提取可以通過位級別操作來完成。

這應該工作:

int mONTimeCount = 0x00FD;
int msb_byte1, lsb_byte2; int Swappedbytes;
String ONText;
msb_byte1 = mONTimeCount & 0x000000FF;
lsb_byte2 = (mONTimeCount >> 8) & 0x000000FF;
Swappedbytes = ((msb_byte1<<8) | lsb_byte2);

暫無
暫無

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

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