16进制转字节数组为负数问题

发布时间 2023-05-16 18:14:20作者: 清华大咖

举例:

B9 转换成字节数组为 -73或者185

为什么如果是-73字节数组 再转回为16进制为 :0xFFFFFFB9,与原来的B9相差

解析:

在java里面

B9 转换成二进制为:

00000000  00000000  00000000 10110101

Int转换为Byte的过程,也是将Int里32个bit的前24个“砍掉”,只留下最后8个bit的过程 即为:10110101

因为byte里第一位为符号位,0为正,1为负,且负数均用补码表示

10110101转换成十进制可以有 -73,185代表字节数

如果是正整数

10110101=181

如果是负整数

10110101(补)=10111001(原)=  -73 (10进制)

如果Byte第一位为1,Java会认为此数为负数,并做位扩展,加上24个1

那么

-73 为11111111 11111111 11111111 10110101 转换成16进制为:0xFFFFFFB9

解决方法:按位与运算,将负数转为正整数

按位与运算
-73 11111111 11111111 11111111 10110101 0XFF 00000000 00000000 00000000 11111111
-73&0xff 00000000 00000000 00000000 10110101 =181=B9