byte转int出现的符号错误
byte转int出现的符号错误
byte转int出现的符号错误
  • 发表于 2年前
  • 阅读 12
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

这是来自于一个Bug的经验教训。服务端序列化一个大小为2个字节的无符号整形数,客户端收到后按位或来自恢复(每个字节存为byte)。原始代码:

int v = (data[offset++] << 8) | (data[offset++]);

无符号整形数0x00D6在接收到解出来变成了-42。

原因其实很简单,是因为byte本身是有符号的,它放不下0xD6。改动也比较简单:

int v = ((status[offset++] << 8) & 0xFF) | ((status[offset++]) & 0xFF);

附测试的小程序

public class ByteSheft {
	public static void main(String[] args){
		byte[] status = new byte[2];
		status[0] = 0x00;
		status[1] = (byte) 0xD6;
		
		int v1 = ((status[0] << 8) | (status[1]));
		int v2 = (status[0] << 8);
		int v3 = (status[1]);
		int v4 = (status[1] & 0xFF);
		
		System.out.println(v1);
		System.out.println(v2);
		System.out.println(v3);
		System.out.println(v4);
	}
}

在赋值的第五行,如果没有强转编译器会报错,其实这个错误信息也我们提示了这个错误。

输出:

-42

0

-42

214




共有 人打赏支持
粉丝 84
博文 285
码字总数 335333
×
开源中国驻成都办事处
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: