【proto】python根据proto文件构造message,并换为二进制

news/2025/1/23 10:31:20/文章来源:https://www.cnblogs.com/fireblackman/p/18292026

一、场景

    测试需要构造数据,而且存储的格式为grpc消息的二进制格式,所以必须要根据proto构造二进制

 

二、构造方法

1、根据proto文件生成python格式的pb文件

python3 -m grpc_tools.protoc -I. proto/upload_state.proto --python_out=. --grpc_python_out=.

 

2、检查文件生成

 

3、编写构造脚本

import base64
import json
import pickle
import redis
import time
import threading
import concurrent.futuresfrom datetime import datetime
from copy import deepcopyfrom google.protobuf.json_format import MessageToJsonimport upload_state_pb2 as upload_state_pb2data = {......
}
def pack_data_proto_obj(vehicle, data_info_list):# 生成file_info_listfile_info_list_obj = upload_state_pb2.FileInfoList()file_info_list_obj.update_operation = "UPDATE"for data_info in data_info_list:data_info.append({"file_name": file_name,"file_type": data_info[0]["file_type"],......"del_flag": True})for index in range(len(data_info)):# 生成file_info对象file_info_obj = upload_state_pb2.FileInfo()file_info_obj.file_name = data_info[index]["file_name"].replace("vehicle", vehicle)file_info_obj.file_type = data_info[index]["file_type"]
......
file_info_obj.del_flag = data_info[index]["del_flag"]file_info_list_obj.file_infos.append(file_info_obj)# 生成vehicle_upload_infovehicle_upload_info_obj = upload_state_pb2.VehicleUploadInfo()vehicle_upload_info_obj.vehicle = vehiclevehicle_upload_info_obj.msg_type = data["msg_type"]vehicle_upload_info_obj.file_info_list.CopyFrom(file_info_list_obj)proto_data = vehicle_upload_info_obj.SerializeToString()print(proto_data)vehicle_upload_info_obj2 = upload_state_pb2.VehicleUploadInfo()vehicle_upload_info_obj2.ParseFromString(proto_data)json_string = MessageToJson(vehicle_upload_info_obj2)print(json_string)return proto_data# 转proto字符串 # vehicle_upload_info_obj1 = upload_state_pb2.VehicleUploadInfo() # vehicle_upload_info_obj1.ParseFromString(proto_data) # print(vehicle_upload_info_obj1)

vehicle_upload_info_obj2 = upload_state_pb2.VehicleUploadInfo()
vehicle_upload_info_obj2.ParseFromString(proto_data)
json_string = MessageToJson(vehicle_upload_info_obj2)
print(json_string)

if __name__ == '__main__':pass

内容省略,主要是三层message嵌套

关键点就是append和CopyFrom来组装

消息转换的方法MessageToJsonParseFromString

 

 

 

参考链接:

proto与json的互相转换_proto转json-CSDN博客

Python 使用 Protobuf 的 message 嵌套,repeated 字段类型,google.protobuf.Any 字段类型,enum 枚举字段_protobuf repeated enum-CSDN博客

Python的基本Protobuf指南(序列化数据) - DaisyLinux - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741172.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

electron 跨域/CSP问题

请求报错:Refused to connect to http://127.0.0.1:8000/get?name=kv-grpc because it violates the following Content Security Policy directive: "default-src self". Note that connect-src was not explicitly set, so default-src is used as a fallback 这…

松灵机器人scout mini小车 自主导航(2)——仿真指南

松灵机器人Scout mini小车仿真指南 之前介绍了如何通过CAN TO USB串口实现用键盘控制小车移动。但是一直用小车测试缺乏安全性。而松灵官方贴心的为我们准备了gazebo仿真环境,提供了完整的仿真支持库,本文将介绍如何上手使用仿真。 官方仓库地址:https://github.com/agilexr…

zabbix“专家坐诊”第245期问答

问题一 Q:vfs.dev.discovery拿的是哪里的文件,我看源码里面获取的是/proc/parttions里面的信息,但是我没有这个device,是怎么获取出来的?A:检查下系统内核版本或者agent程序版本,如果未定义KERNEL_2_4的情况下,读的是后面这个文件。 Q:这两个文件我都看过,也没有cdro…

【Python】Word文档操作

一、全文替换 不是创建word文档写入内容,而是基于现有的Word文档进行替换处理 使用run.text直接赋值修改发现样式会丢失,而网上大部分办法都是这么写的... 直到我看到这篇文章的评论:https://blog.csdn.net/qq_40222956/article/details/106098464 除了段落替换后,Word文档…

【ubuntu】安装go

一、官网 https://golang.google.cn/dl/ 选择稳定版本,点击下载二、安装步骤 1、解压2、移动目录sudo mv go /usr/local3、配置环境变量 vim ~/.bashrcexport PATH=$PATH:/usr/local/go/bin export GOPATH=$HOME/gocode创建gocode目录 vim ~/.profile 添加同样配置三、验证$ g…

2024迎新马拉松——字典

思路 这道题可以把每个单词正过来放在一个字典树里。 把每个单词反过来,给每个单词单独建立一个字典树。 而询问要求的就是前缀在正串的字典树上的那个节点为根的子树中,所有串的反串字典树合并之后的那个字典树上,后缀的那个节点所对应的子树当中有多少个串就是答案。 举个…

win11系统 连接共享打印机提示 0x0000709

windows11 用户在添加共享打印机的时候,遇到了系统错误提示:操作无法完成(错误0x0000709) 其他查考文章: https://baijiahao.baidu.com/s?id=1788757659395932042&wfr=spider&for=pc

24迎新马拉松——字典

思路 这道题我们可以把每个单词正过来放在一个字典树里。 而我们把每个单词反过来,给每个单词单独建立一个字典树。 而询问要求的就是前缀在正串的字典树上的那个节点为根的子树中,所有串的反串字典树合并之后的那个字典树上,后缀的那个节点所对应的子树当中有多少个串就是答…

香橙派5plus上跑云手机方案二 waydroid

前言 上篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)说了怎么跑带GPU加速的redroid方案,这篇说下怎么在香橙派下使用Waydroid。 温馨提示 虽然能运行,但是体验下来只能用软件加速,无法使用GPU加速,所有会很卡。而且Waydroid还依赖于桌面环境wayland,要么插上显…

弹性伸缩落地实践

1. 什么是 HPA ? HPA(Horizontal Pod Autoscaler)是 Kubernetes 中的一种资源自动伸缩机制,用于根据某些指标动态调整 Pod 的副本数量。 2. 什么时候需要 HPA ?负载波动:当您的应用程序的负载经常发生波动时,HPA 可以自动调整 Pod 的副本数量,以适应负载的变化。例如,…

三星 NAND FLASH命名规范 Samsung NAND Flash Code Information

一共有三页,介绍了前面主要的编号和横杠后面的编号,当前文档只关注前面的编号。 从前面的命名规范中可以得知当前芯片的容量、技术等概要信息,对芯片有一个整体了解。 详细解释 Small Classification 表示存储单元的类型和应用,比如 SLC 1 Chip XD Card 表示是SLC的,包含1…

[转]ZeroMQ用法说明及C++示例

原文链接:https://blog.csdn.net/qq_40344790/article/details/130865273ZMQ介绍 官网:https://zeromq.org/ Github:https://github.com/zeromq/libzmq ZMQ(ZeroMQ)是一种高性能的异步消息传递库,它可以在不同的进程和机器之间进行消息传递。它提供了多种传输协议、通信模…