我的数据在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 是符号位。
答案 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);