如何在Java中进行大端到小端字节交换

如何在Java中进行大端到小端字节交换,java,Java,我的数据在java中存储为int,表示始终为正的无符号16位值 大端十进制253存储为16位无符号十六进制字符0x00FD,串行传输到 运行Android的Little Endian ARM显示为64768十进制,即十六进制0xFD00 所以我需要交换字节 问题是应用程序是在JAVA中,主要使用签名数据类型 定义为有符号8位的java字节 定义为有符号32位的java整数 1 private void UI_Update_RunVars() {byte msb_byte1, lsb_byte

我的数据在java中存储为int,表示始终为正的无符号16位值

大端十进制253存储为16位无符号十六进制字符0x00FD,串行传输到
运行Android的Little Endian ARM显示为64768十进制,即十六进制0xFD00 所以我需要交换字节

问题是应用程序是在JAVA中,主要使用签名数据类型

定义为有符号8位的java字节 定义为有符号32位的java整数

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   } 
1 private void UI\u Update\u RunVars(){byte msb\u byte1,lsb\u byte2;int Swappedbytes;
2字符串上下文;
3 msb_字节1=(字节)mONTimeCount;
4 lsb_字节2=(字节)(mONTimeCount>>8);

5 Swappedbytes=((msb_字节1使用字节实际上会使其更加复杂。您可以使用整数执行所有操作。让
v
作为要转换的值:

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

int swapped=((v>>8)&0xff)|((v&0xff)使用字节实际上会使其更加复杂。您可以使用整数执行所有操作。让
v
作为要转换的值:

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

int swapped=((v>>8)&0xff)|((v&0xff)首先我认为
Integer.reverseBytes
应该可以解决这个问题,但共享代码的实际问题是,我们将整数减少到字节,这将使其为负。相反,我们可以只保留整数计算

字节级信息的提取可以通过位级操作完成

这应该起作用:

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);
int-mONTimeCount=0x00FD;
int msb_字节1,lsb_字节2;int Swappedbytes;
字符串上下文;
msb_字节1=mONTimeCount&0x000000FF;
lsb_字节2=(mONTimeCount>>8)&0x000000FF;

Swappedbytes=((msb_byte1首先,我认为
Integer.reverseebytes
应该可以解决这个问题,但共享代码的实际问题是,我们将整数减少为字节,这将使其无论如何都为负。相反,我们可以只保留整数中的计算

字节级信息的提取可以通过位级操作完成

这应该起作用:

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);
int-mONTimeCount=0x00FD;
int msb_字节1,lsb_字节2;int Swappedbytes;
字符串上下文;
msb_字节1=mONTimeCount&0x000000FF;
lsb_字节2=(mONTimeCount>>8)&0x000000FF;

交换字节=((msb_Byte1相关:特别是,我认为您应该能够使用一些
Integer.reverseBytes
,但到目前为止,我已经使用了。可能我的16位算术已经生锈。
Integer.reverseBytes
工作正常。您共享的代码可能会有点混乱,因为
int
是32位,而不是16位:您正在反转
FD00。)
0000FD00
的简写,而你得到的
FD0000
00FD0000
的简写。相关:特别是,我认为你应该能够使用
整数.reverseBytes
,但到目前为止我已经有了。也许我的16位算法已经生锈了。
Integer.reverseBytes
工作正常。T您共享的代码可能会有点混淆,因为
int
是32位,而不是16位:您正在反转
FD00
,这是
0000FD00
的缩写,您会得到
FD0000
,这是
00FD0000
的缩写。是的,我意识到这只是16位数字,并删除了我的注释。回答很好。简洁。最后我意识到我得到的答案和你的一样。是的,我意识到这只是16位的数字,并删除了我的评论。答案很好,很简洁。最后我意识到我得到的答案和你的一样。