Java没有unsigned类型,作者一定很后悔,现在加还来得及。没有unsigned类型,使得java在编解码方面成为残疾。这主要是作者在开始时只是把Java定位为一种脚本语言,要求不是太高。好吧,在Java里把整数分为byte short intlong四种类型,是没有unsigned类型的。那么在处理序列化数据时该怎么办呢?
字面整型常量默认为int型
例如:
long
字面整型常量默认为int型
例如:
long
a =0xA1;
//a为正数
long a = 0xA1A2; // a为正数
long a =0xA1A2A3A4;
//a为负数,0xA1A2A3A4自动为一个int值,显然int型最大0x7FFFFFFF,所以a被视为负数。
然而这句的本意是给a赋一个正数值,怎么做呢?-- 给字面常量添加 L 后缀即可。
正确写法为:
给字节数据赋值字面常量
byte arr[] = new byte[2];
byte[0] = (byte) 0xA1;
//用byte强转,因为右侧被视为一个int型,其值为正数 > 128,显示byte存不下这个值
byte[1] = (byte) 0xA2;
字节合并成整数
接收到数据 arr[],合成整数: &0xFF变成正的int
long v = (
(arr[0]& 0xFF ) << 8)
+ (arr[1] & 0xFF);
arr[0] & 0xFF 这个表达式的类型为 int
4字节合并
long
long
long a = 0xA1; // a为正数
long a = 0xA1A2; // a为正数
long a = 0xA1A2A3A4; // a为负数,0xA1A2A3A4自动为一个int值,显然int型最大0x7FFFFFFF,所以a被视为负数。然而这句的本意是给a赋一个正数值,怎么做呢? -- 给字面常量添加 L 后缀即可。
然而这句的本意是给a赋一个正数值,怎么做呢?-- 给字面常量添加 L 后缀即可。
正确写法为:
long a = 0xA1A2A3A4L;
给字节数据赋值字面常量
byte arr[] = new byte[2];
byte[0] = (byte) 0xA1;
byte[1] = (byte) 0xA2;
字节合并成整数
接收到数据 arr[],合成整数:
long v =
arr[0] & 0xFF 这个表达式的类型为 int
4字节合并
public static long ToUint4(byte arr[])
{
return ((long)(arr[0]&0xFF) << 24)
+ ((long)(arr[1]&0xFF) << 16)
+ ((long)(arr[0]&0xFF) << 8)
+ ((long)(arr[0]&0xFF)) ;
}