Thrift的TBinaryProtocol二进制协议分析
Posted JavaGarden
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift的TBinaryProtocol二进制协议分析相关的知识,希望对你有一定的参考价值。
先上张图,说明一下thrift的二进制协议是什么东东。
报文格式编码:
bool类型:
一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0).
Byte类型:
一个字节的类型,两个字节的字段编号,一个字节的值.
I16类型:
一个字节的类型,两个字节的字段编号,两个字节的值.
I32类型:
一个字节的类型,两个字节的字段编号,四个字节的值.
I64类型和double类型:
一个字节的类型,两个字节的字段编号,八个字节的值.
String类型:
一个字节的类型,两个字节的字段编号,四个字节的负载数据长度,负载数据的值.
Struct类型:
一个字节的类型,两个字节的字段编号,结构体负载数据,一个字节的结束标记.
MAP类型:
一个字节的类型,两个字节的字段编号,一个字节的键类型,一个字节的值类型,四个字节的负载数据长度,负载数据的值.
Set类型:
一个字节的类型,两个字节的字段编号,一个字节的值类型,四个字节的负载数据长度,负载数据的值.
List类型:
一个字节的类型,两个字节的字段编号,一个字节的值类型,四个字节的负载数据长度,负载数据的值.
消息(函数)类型:
表示方式一:四个字节的版本(含调用类型),四个字节的消息名称长度,消息名称,四个字节的流水号,消息负载数据的值,一个字节的结束标记。
表示方式二:四个字节的消息名称长度,消息名称,一个字节调用类型,四个字节的流水号,消息负载数据的值,一个字节的结束标记。
对严格的thrift消息,必须包含32为版本信息。
若有32为版本信息,函数调用(请求:1,响应:2,异常:3,无返回值的请求:4)被包含到32为版本中,不独立出现。
计算方法:
32位版本 = 0x8001000 & 函数调用
计算后,请求报文的32为版本值为 0x80010001;响应报文的32为版本值为 0x80010002;异常报文的32为版本值为 0x80010003;
若没有32为版本信息时,函数调用(请求:1,响应:2,异常:3,无返回值的请求:4)独立出现在消息报文中。
thrift的IDL文件如下:
1
以上是关于Thrift的TBinaryProtocol二进制协议分析的主要内容,如果未能解决你的问题,请参考以下文章 thrift windows服务运行时显示 errno = 10022 怎么办?? |