TLV文档阅读笔记-What is TLV及protobuf

Posted IT1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TLV文档阅读笔记-What is TLV及protobuf相关的知识,希望对你有一定的参考价值。

TLV的全称为tag-length-value,接地气的名字叫type-length-value。

type:指数据的类型;

length:指value的长度;

value:为值

如下面这个TLV表示数据,准备这样的TLV包:

Data Tag = DF 82 0A   
Data Length = 03  
Data Value =  30 31 32. 

在发送的时候就是这样的:

DF 82 0A 03 30 31 32

这些数据还没组合起来,比如:

DF 82 0A 03 30 31 32 DF 82 0B 04 01 12 22 33

tag1为:DF 82 0A

tag2为:DF 82 0B

这些都是被提前定义的,接收端读取时先读tag,然后在读length,再读后面的length长度的值(value字段)

下面是protobuf

早期的tlv是标准的type length value,此时没有id,后来有id了,是为了解决协议变动时的向前向后兼容性,但这个也不是protobuf的独创,早先已经有很多这种用法了,如今tlv的t就是tag,一般指(id, type),length则是个可选参数,根据type有时length是固定的,此时length可省略。

如下代码:

MyTest.java

package cn.it1995;

import com.baidu.bjf.remoting.protobuf.annotation.ProtobufClass;
import lombok.Data;

@Data
@ProtobufClass
public class MyTest {

    private String name1;
    private String name2;
    private Integer intValue;
    private Float floatValue;
}

Main.java

package cn.it1995;

import com.baidu.bjf.remoting.protobuf.Codec;
import com.baidu.bjf.remoting.protobuf.ProtobufProxy;

public class Main {

    public static void main(String[] args) {

        Codec<MyTest> myTestCodec = ProtobufProxy.create(MyTest.class);
        MyTest myTest = new MyTest();
        myTest.setName1("aaa");
        myTest.setName2("bbbb");
        myTest.setIntValue(99);
//        myTest.setFloatValue(100.0f);

        try{

            byte[] encode = myTestCodec.encode(myTest);
            System.out.println("十六进制");
            for(Integer i = 0; i < encode.length; i++){

                System.out.print(Integer.toHexString(encode[i]) + " ");
            }

            System.out.println();
            MyTest decode = myTestCodec.decode(encode);
            System.out.println(decode);
        }
        catch (Exception e){

            e.printStackTrace();
        }
    }
}

porn.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>ProtobufDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <dependency>
            <groupId>com.baidu</groupId>
            <artifactId>jprotobuf</artifactId>
            <version>2.4.9</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>


    </dependencies>

</project>

运行截图如下:

当为这样的值时:

        myTest.setName1("aaa");
        myTest.setName2("bbbb");
        myTest.setIntValue(1000);

这个a代表是name1,这个12代表name,18代表intvalue。

当为这样的值时:

        myTest.setName1("aaa");
        myTest.setName2("bbbb");
        myTest.setIntValue(99);

 是这样的:

 

以上是关于TLV文档阅读笔记-What is TLV及protobuf的主要内容,如果未能解决你的问题,请参考以下文章

TLV320ADC3101这颗立体声 ADC芯片分析体验及总结

转载看懂通信协议:自定义通信协议设计之TLV编码应用

ASN.1笔记——标准编码规则BER

解码 BER TLV

无法解析智能卡获取响应 (TLV)

TI德州芯片TLV系列和TPS系列芯片区别(转)