java解析自定义tlv格式
• Tag字段占12bit;
• Format字段占4bit,编码如下:
0:变长字段,Value长度由Length决定
1:Value为一个字节
2:Value为两个字节
3:Value为三个字节
4:Value为四个字节
5:Value为五个字节
6:Value为六个字节
7:Value为八个字节
8:Value为16个字节
9:Value为32字节
10:Value为64字节
11:Value为128字节
12:Value为256字节
• Length字段占16bit,当Format为0时存在,值不包含Length本身;
• Value字段根据Format和Length字段决定。
对于V类型的字段,长度为2 bytes、4 bytes和8 bytes的整型值,使用网络序上报。
对于LV类型的字段,L以网络序上报。
网络传输第一个字节为Tag值的低8bit字节,第二个字节为Format值和Tag值的高4bit
说明:Format值为0时候,value的内容长度由length字段决定,如内容长度为7、9、100等;如果Format值不为0时候,value的内容长度由上面Format的值确定,此时没有Length字段,TLV格式退化为TV格式。下文中所述TLV格式包含此种情况。
按照先读取前两个字节然后按照位移取值感觉不对,求助大神们解答一下
代码如下:
public static byte[] getData(IoBuffer ioBuffer) {
byte[] bytes = new byte[2];
ioBuffer.get(bytes);
int val = ByteUtil.byteArrayToInt2(bytes);
int format = val>>12;
int len = 0;
if(format==0){
//0:变长字段,Value长度由Length决定
byte[] lenBytes = new byte[2];
ioBuffer.get(lenBytes);
len = ByteUtil.byteArrayToInt2(lenBytes);
}else {
if(format<8){
len = format==7?8:format;
}else{
len = (int)Math.pow(2,(format-7)) * 8;
}
}
byte[] data = new byte[len];
ioBuffer.get(data);
return data;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
老哥这个问题最后是什么情况,求教。