文档章节

byte转int出现的符号错误

开源中国驻成都办事处
 开源中国驻成都办事处
发布于 2015/06/16 12:52
字数 233
阅读 13
收藏 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
博文 287
码字总数 335913
作品 0
成都
程序员
mysql utf8mb4与emoji表情【转】

MYSQL 5.5 之前, UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区, BMP是从哪到哪,到http://en.wikipedia.org/wiki/MappingofUnicodecharacters这里看,基本就是0000~FFFF这一...

万里虎
2016/03/16
63
0
java 类型转换的原理

最近在看JDK的源码,在看源码的时候看到了0xff这么个东东,从这里引出了类型转换。因此在此记录下。 在写原理之前先看几个例子。byte b=-1;int a=b;然后打印a得出的结果是-1.int b=-1;byte ...

小宋
2016/04/04
196
0
Java 位运算再学习-byte负数问题

代码Review中出现的问题. 基础知识不是很牢固,要时刻注意积累. 基础知识 byte:一个字节(8位)(-128~127)(-2的7次方到2的7次方-1) short:两个字节(16位)(-32768~32767)(-2的15次方...

SuShine
2016/03/30
209
0
java Byte和各数据类型(short,int,long,float,double)之间的转换

在Java的网络编程中传输的经常是byte数组,但我们实际中使用的数据类型可能是任一种数据类型,这就需要在它们之间相互转换,转换的核心在于将其他类型的数据的每一位转换成byte类型的数据。下...

phacks
2015/01/23
0
0
Java 中int与byte数组转换详解

1、与运算符的理解(&): 参加运算的两个数据,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0。即 0&0=0;0&1=0;1&0=0;1&1=1; 例子:int x = 6225555...

jiachcheng
2012/12/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis应用之分布式锁(set)

Redis应用之分布式锁(set) 在单机应用的场景下,我们常使用的锁主要是synchronized与Lock;但是在分布式横行的大环境下,显然仅仅这两种锁已经无法满足我们的需求; 需求:秒杀场景下,有若干...

GMarshal
26分钟前
1
0
python实现简单的文件加密与解密

对于任意的一个文件,本质上来讲都是二进制的。 对于任意一个二进制数a,对其用另外任意一个与a的位数相同的二进制数m进行“异或”操作得到结果e,即e=a xor m; 如果再讲上面得到的e用m进行...

Aomo
28分钟前
1
0
Android开发应用程序生成以太坊钱包

Android应用程序以太坊钱包生成,要做的工作不少,不过如果我们一步一步来应该也比较清楚: 1.在app/build.gradle中集成以下依赖项: compile ('org.web3j:core-android:2.2.1') web3j核心是...

geek12345
43分钟前
1
0
ArrayList嘿嘿嘿

数组扩容技术: //扩容技术 将原数组objs类容复制到新数组并且长度为11 Object[] newObjs = Arrays.copyOf(objs,11); 数组比较大那么System.arraycopy比较有优势,因为其使用的是内存复制,省...

熊猫你好
今天
2
0
Android平台下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

python版的sxtwl_cpp传送入口 在build.gradle的allprojects中加入 maven { url 'https://dl.bintray.com/yuangu/sxtwl' } 最终如下面代码所示: allprojects { repositories { ......

元谷
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部