点击(此处)折叠或打开
-
在网络传输时,我们接收到的数据都是10的形式,八个01(big)构成了一个byte字节,一个或多个byte又构成了不同的数据类型,接收到这些byte数组后,我们就需要对数组进行反序列化为java中的对象。而通过javolution.io.Struct就可以很容易的实现反序列化(序列化)
-
首先,我们要按照数据顺序定义结构体(java的class文件):该类型必须继承Struct,byte数组中,不同的类型按照byte数,一一对应
-
如char在传输中占用8bit,所以我们就用Unsigned8 (无符号8bit)来接收,int在占位32位,于是我们用Unsigned32来接收,char[]我们通过UTF8String 来接收。这样我们就定义好了如果接收一个byte数组序列了,可以通过以下两个函数指定大小端。
-
————————————————————————————————
-
-
public class BaseDataDef extends Struct{
-
Unsigned8 unsigned8=new Unsigned8();
-
Unsigned16 unsigned16=new Unsigned16();
-
Unsigned32 Unsigned32=new Unsigned32();
-
Signed8 signed8 =new Signed8();
-
Signed16 Signed16 =new Signed16();
-
Signed32 Signed32 =new Signed32();
-
Signed64 Signed64 =new Signed64();
-
UTF8String utf8String=new UTF8String(10);
-
// 一定要加上这个,不然会出现对齐的问题
-
@Override
-
public boolean isPacked() {
-
return true;
-
}
-
-
// 设置为小端数据
-
@Override
-
public ByteOrder byteOrder() {
-
return ByteOrder.LITTLE_ENDIAN;
-
}
-
}
-
————————————————————————————————————————————————————————————————
-
然后我们可以将byte数据填入到这个类中
-
-
@Test
-
public void setUp() throws Exception {
-
//这里模拟了一下数据的输入
-
byte[] data = new byte[221];
-
for (int i = 0; i < data.length; i++) {
-
data[i] = (byte) i;
-
}
-
ByteBuffer b = ByteBuffer.wrap(data);
-
//小端
-
b.order(ByteOrder.LITTLE_ENDIAN);
-
BaseDataDef info=new BaseDataDef ();
-
//设置byte数组
-
info.setByteBuffer(b, 0);
-
//打印输出,这里输出byte字符串
-
System.out.println(info);
-
//如果想打印某一个项,直接
-
System.out.println(info.unsigned16);
-
-
System.out.println("#########################");
- }