java解析自定义tlv格式

image.png

• 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;
}
阅读 2.6k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题