这个问题真恶心耗费了我差不多一下午的时间才解决。
我先说明一下我的需求吧,供大家参考。
我是在解析一段数据,这段数据我们是采用字节来截取的,在数据中,前几个字段都是有指定的字节长度,后面的也有指定的字节长度,就中间的没有指定长度,类似如下图:
在第七个的字节长度为N的意思是说,这个字段的长度不一定,说不定有多少呢。
然后是我的以前的解决方案,
//实体类
@StructClass
public class BMS_StateMessagess {
@StructField(order = 0)
private byte[] field1 = new byte[1];//字段1
@StructField(order = 1)
private byte[] field2 = new byte[1];//字段2
@StructField(order = 2)
private byte[] field3 = new byte[1];//字段3
@StructField(order = 3)
private byte[] field4 = new byte[1];//字段4
@StructField(order = 4)
private byte[] field5 = new byte[1];//字段5
@StructField(order = 5)
private byte[] field6 = new byte[2];//字段6
//从后端处理的值传到这里
private int field7Length;//字段7长度
//然后将值再赋值到 byte 里面充当长度
@StructField(order = 6)
private byte[] field7 = new byte[field7Length];//字段7
@StructField(order = 7)
private byte[] field8 = new byte[2];//字段8
@StructField(order = 8)
private byte[] field9 = new byte[1];//字段9
//get... set...就不写了
}
然后是后台我是这样写的
//这是数据
String message2 = "12423534668758832345096532468883457222789367087835345973729020207398009999";
BMS_StateMessagess bms_stateMessagess = new BMS_StateMessagess();
//先计算,数据的长度减去已知的字节长度得到的是字符的长度再除以2就剩下N的字节长度
int i1 = (message2.length() - 10 * 2) / 2;
//将值 set 给 Field7Length 里面
bms_stateMessagess.setField7Length( i1 );
这样写是有问题的,问题在,我们通过 new 这个实体类的时候,实体类就已经完成了字节分割,因为我们没有指定长度,所以第七个就是个空的,这样是不对的,不是我们想要的东西。
然后我们就通过各种测试,发现了在后端这样写也可以
String message2 = "12423534668758832345096532468883457222789367087835345973729020207398009999";
BMS_StateMessagess bms_stateMessagess = new BMS_StateMessagess();
//在这里进行计算,直接在这里进行字节分割的操作,并直接得到自己需要的数据
byte[] field7Length = new byte[(message2.length()-10*2)/2];
//然后在这里直接 set 给字段里取,这样实体类里的字段就充当的普通字段读取操作,并不参与分割数据。
bms_stateMessagess.setField7(field7Length);
这样就完美解决了。
实属不易,记录一下分享而已。