我的数据在java中存储为int类型。<32位signed>,表示始终为正的无符号16位值。
存储为16位无符号十六进制字符0x00FD的大端十进制253串行传输到
运行安卓的小端臂,显示为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。
当数据类型是有符号的时,如何执行无符号数学和字符串操作。
我的应用程序很简单,接受无符号的16位数字,并将其转换为小时、分钟、秒形式的时间
所以上面的代码实际上适用于任何十六进制数,只要没有设置msb,
例如,任何0x7F或更低的数字都可以工作,但任何0x80或更大的数字都会失败,因为msb是符号位。
发布于 2018-01-24 17:31:56
使用字节实际上会使它变得更加复杂。你可以对整数做所有的操作。让v
作为要转换的值:
int swapped = ((v >> 8) & 0xff) | ((v & 0xff) << 8);
发布于 2018-01-24 17:53:19
首先,我认为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);
https://stackoverflow.com/questions/48428315
复制