安卓开发中 接收电脑发来的16进制数据出现负值 记录一下
如图 接收030407e20001020000de8d ,接受到的字节数组为
[3, 4, 7, -30, 0, 1, 2, 0, 0, -34, -115]
很显然 出现负值
。对我只管印象就不对的 正常的acii码来说
03 3
04 4
07 7
e2 -30
.
.
下边的就不一一举例
我们知道e2的acii码就是226啊 不是-30啊
我们转换一下二进制 来进一步解释
16进制 | 二进制 |
---|---|
e2 | 11100010 |
明显就是 226 啊 怎么-30 出现负数我们肯定可以想到的就是反码补码知识
原码表示 1110 0010 就是 2^7 + 2 ^ 6 +2 ^5 +2 ^1 =128 +64+32+2=226
但是机器的运算由于原码和反码的计算不方便 运用补码计算
补码表示 1110 0010 补码第一位是符号位 其余是原码取反在加1
1110 0010 我们反计算原码
符号位 | |
---|---|
1 | 1100010 |
1代表负数相当于 -110 0010
110 0010 -1= 110 0001 110 0001是反码
110 0001在取反求出原码 001 1110 转化为16进制16+ 8+4+2=30
取符号 -30
所以问题就是编码问题
详细介绍原码补码参考这一篇。
https://blog.csdn.net/qq_31469369/article/details/103399831