如何在Java中对big endian字节交换执行big endian

时间:2018-01-24 17:23:50

标签: java

我的数据在java中存储为int。 < 32bit signed>,表示始终为正的无符号16位值。

存储为16位无符号十六进制字符0x00FD的Big Endian十进制253被串行发送到
运行Android的Little Endian ARM显示为64768十进制,十六进制0xFD00 所以我需要交换字节。

问题是App在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   } 

所以我上面的例子,我发送0x00FD为十进制253大端,它在litte endian上以0xFD00到达 我调用方法UI_Update_RunVars();其中mONTimeCount = 0xFD00我需要交换字节以在屏幕上显示十进制数253是“4分钟,13秒” 在调试器中:

第3行执行为msb_byte1 = 0x00; 第4行执行为lsb_byte2 = 0xFD; 第5行是发生错误的地方 第5行在调试器中显示为-3,这是正确的数学但不是正确的答案 有符号32位整数的第5-3行显示为十六进制0xFFFF_FFFD,我想要0x00FD

签名数据类型时,如何进行无符号数学运算和字符串运算。

我的应用程序很简单,取UNSIGNED 16位数字并以小时分秒的形式将其转换为时间

所以上面的代码实际上适用于任何十六进制数,只要没有设置msb,

例如任何数字0x7F或更低的数字都有效,但任何数字0x80或更多都会失败,因为msb    是符号位。

2 个答案:

答案 0 :(得分:5)

使用字节实际上使它更复杂。您可以使用整数进行所有操作。设v为要转换的值:

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

答案 1 :(得分:1)

首先我认为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);