python处理Protoc Buffers协议下的header+protobuf
2018-01-09 19:46
645 查看
项目中碰到了tcp透传下用protocol buffer协议的数据传输场景
记录下踩的坑~~
协议的定义大致举例如下:
数据传输协议组成部分分为header结构体和一个传输数据message体
header如下,其中某个param是需要截取的message包体长度(如这里是param_3)
message的结构为:
接口拿到的是二进制流,需要实现的步骤如下大致如下:
将拿到的二进制流转换到十六进制流hex_data(根据协议定义,字节截取是在十六进制下进行);
根据协议在约定的字节区间截取header中的param_3,这个值是后边需要截取的数据包字节长度,然后将param_3转换成二进制下的整型数字param_3_int;从header信息结束字节处开始,截取hex_data中长度为param_3_int*2的字节段;
将截取的字节段重新转换成二进制流;
然后用protoc的方法解析出来;
解析后是一个json格式的数据体了,如果这个数据体内还有json对象需要取,可能需要将单引号转换为双引号,将多于的无效字符清除,然后再loads数据,如下:
记录下踩的坑~~
协议的定义大致举例如下:
数据传输协议组成部分分为header结构体和一个传输数据message体
header如下,其中某个param是需要截取的message包体长度(如这里是param_3)
struct header { unsigned short param_1; // 头信息定义参数1 unsigned short param_2; // 头信息定义参数2 unsigned short param_3; // 头信息定义参数3 }
message的结构为:
message request_params { optional uint64 param_4 = 1; // 参数4 optional string param_5 = 2; // 参数5 }
接口拿到的是二进制流,需要实现的步骤如下大致如下:
将拿到的二进制流转换到十六进制流hex_data(根据协议定义,字节截取是在十六进制下进行);
data = self.request.recv(10000) data2 = data.encode('hex')
根据协议在约定的字节区间截取header中的param_3,这个值是后边需要截取的数据包字节长度,然后将param_3转换成二进制下的整型数字param_3_int;从header信息结束字节处开始,截取hex_data中长度为param_3_int*2的字节段;
param_3 = data2[x:y] data4 = (int(str(param_3), 16)) * 2 data5 = data2[y:y + data4
将截取的字节段重新转换成二进制流;
data6 = binascii.a2b_hex(data5)
然后用protoc的方法解析出来;
req = request_params() req.ParseFromString(data6) json_str = protobuf_json.pb2json(req)
解析后是一个json格式的数据体了,如果这个数据体内还有json对象需要取,可能需要将单引号转换为双引号,将多于的无效字符清除,然后再loads数据,如下:
data = data.replace('\'', '\"') data = data.rstrip('\x00') loaded_data = json.loads(data)
相关文章推荐
- python处理http请求中的protobuf
- Python 对谷歌协议文件 .proto 文件的生成与处理 (python 命令、查找、替换)
- 使用自己的Python函数处理Protobuf中的字符串编码
- python处理http请求中的protobuf
- google ProtoBuf开发者指南(比xml和jason都好的协议)
- Protobuf for Python测试保存和读取文件
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
- Google_Protobuf协议——Protobuf语法
- 基于ProtoBuf协议实现网络传输(三)
- 笔记:关于protobuf协议传输repeated(即表/数组)类型数据出错问题。
- python2.7 import caffe遇到的那些坑-skimage.io stdint.h protobuf
- 【神经网络与深度学习】【Python开发】Caffe配置 windows下怎么安装protobuf for python
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
- protobuf(数据协议)
- netty 对 protobuf 协议的解码与包装探究(2)
- python3 使用 protobuf3 序列化踩过的坑
- 【转载】Google Protobuf 协议分析
- 【python+protobuf】在python中使用protocol buffer
- 初次使用Python脚本,proto协议文件转Lua代码
- 【深度学习】笔记11:python caffe报错:No module named google.protobuf.internal