java解析自定义tlv格式

发布于 2022-09-13 00:43:06 字数 1377 浏览 12 评论 0

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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

要走干脆点 2022-09-20 00:43:06

老哥这个问题最后是什么情况,求教。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文