您的位置:首页 > 理论基础 > 数据结构算法

javolution.io.Struct序列化C语言数据结构

2018-01-22 16:18 711 查看
在网络传输时,我们接收到的数据都是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("#########################");
}


*
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  序列化 Signed