python处理Protoc Buffers协议下的header+protobuf

项目中碰到了tcp透传下用protocol buffer协议的数据传输场景
记录下踩的坑~~

协议的定义大致举例如下:

数据传输协议组成部分分为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)