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的主要内容,如果未能解决你的问题,请参考以下文章