byte数组转short值不对啊

czp14778981 2013-11-28 06:38:00
我想把0xffd0转成short类型,真实值应该为-32720,可是实际转出来的怎么是-48?求各位高手帮帮忙,下面是代码:
byte[] bytes = new byte[2];
bytes[0]=(byte)0xd0;
bytes[1]=(byte)0xff;
System.out.println((short) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8))));
...全文
502 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
放纵的青春 2013-11-29
  • 打赏
  • 举报
回复
为毛我看不懂
czp14778981 2013-11-28
  • 打赏
  • 举报
回复
下面是我写的两字节的byte数组按原码的方式转成short类型,还没经过严格测试,不知道有没有bug,欢迎大家指正 public static short getSignedShort(byte[] bytes) { short s = 0; if((bytes[1] & 0x80) == 0x80 ) //判断符号位是否为负数 s = (short) -((0xff & bytes[0]) | (0x7f00 & (bytes[1] << 8))); else s = (short) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8))); return s; }
czp14778981 2013-11-28
  • 打赏
  • 举报
回复
引用 19 楼 waynexuan 的回复:


	public static void main(String[] args) {
		int i=0xffd0;
		short s;
		if (i>0x7fff) {
			s=(short)-(i-0x8000);
		} else {
			s=(short)i;
		}
		System.out.println(s);
	}
谢谢了,我再等等看看有没有更好的方法,明天结贴,送分
WayneXuan 2013-11-28
  • 打赏
  • 举报
回复


	public static void main(String[] args) {
		int i=0xffd0;
		short s;
		if (i>0x7fff) {
			s=(short)-(i-0x8000);
		} else {
			s=(short)i;
		}
		System.out.println(s);
	}
WayneXuan 2013-11-28
  • 打赏
  • 举报
回复
引用 6 楼 czp14778981 的回复:
你是说0xff吗?果然如此,变成-1了,我还以为会是-127呢,那我怎么能把0xffd0转成正确的short类型呢?
建议楼主看看原码和补码相关知识
czp14778981 2013-11-28
  • 打赏
  • 举报
回复
有了解电力系统的IEC104规约吗?那个规约就是这么转的,真是挺别扭的
WayneXuan 2013-11-28
  • 打赏
  • 举报
回复


	public static void main(String[] args) {
		int i=0xffd0;
		int s;
		if (i>0x7fff) {
			s=-(i-0x8000);
		} else {
			s=i;
		}
		System.out.println(s);
	}
WayneXuan 2013-11-28
  • 打赏
  • 举报
回复
0xffd0转成short类型,真实值就是-48 如果非要是-32720,那说明0xffd0是原码,而不是计算机用的补码,不能用常规方法转
czp14778981 2013-11-28
  • 打赏
  • 举报
回复
关键是把byte[1]&0x7f后,还得把符号位保留,然后在还原也挺麻烦的
时光清浅 2013-11-28
  • 打赏
  • 举报
回复
应该有,看看大家怎么说吧
czp14778981 2013-11-28
  • 打赏
  • 举报
回复
这个方法我倒也想过,还有没有更好的办法?
时光清浅 2013-11-28
  • 打赏
  • 举报
回复
0xffd0&0x7FFF 多打个0,抱歉。。如果好用的话,楼主别忘了结贴
时光清浅 2013-11-28
  • 打赏
  • 举报
回复
0xffd0&0x07FFF 这么做
czp14778981 2013-11-28
  • 打赏
  • 举报
回复
客户是这样规定的:0xffd0转成二进制就是1111 1111 1101 0000,第一位是符号位,后面是15位是实际值,后十五位转成十进制就是32720
时光清浅 2013-11-28
  • 打赏
  • 举报
回复
java都是符号数据类型,-32720这个值怎么算出来的?
czp14778981 2013-11-28
  • 打赏
  • 举报
回复
引用 5 楼 u011935764 的回复:
取反+1,结果就是-48
可是我想要的结果是-32720啊
czp14778981 2013-11-28
  • 打赏
  • 举报
回复
你是说0xff吗?果然如此,变成-1了,我还以为会是-127呢,那我怎么能把0xffd0转成正确的short类型呢?
时光清浅 2013-11-28
  • 打赏
  • 举报
回复
取反+1,结果就是-48
时光清浅 2013-11-28
  • 打赏
  • 举报
回复
0xffd0转成short类型,应该是多少
wuer0520 2013-11-28
  • 打赏
  • 举报
回复
你byte能装下那么多么,你强转的时候已经丢失精度了,自己打印下数组的数据就知道了
加载更多回复(2)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧