首页 > 编程语言 >protobuf golang&&python序列化反序列化测试

protobuf golang&&python序列化反序列化测试

时间:2023-03-03 14:44:49浏览次数:41  
标签:protobuf python hex 0x00 bytes 序列化 my

1.概要

最近考虑采用protobuf来实现kafka消息传递,所以先测试一下golang和python之前序列化互通问题。

由于go和python对于二进制的表示在ide层面是无法统一的,直接把python的字符串拷出来放到golang肯定是不行的,需要通过hex进行16进制表示法

2.bytes和hex转化语法

  • Bytes -> Hex string

# Python
my_bytes = bytes([0x06, 0xe5, 0x33, 0xfd, 0x1a, 0xda, 0x86, 0x39,
                  0x1f, 0x3f, 0x6c, 0x34, 0x32, 0x04, 0xb0, 0xd2,
                  0x78, 0xd4, 0xaa, 0xec, 0x1c, 0x0b, 0x20, 0xaa,
                  0x27, 0xba, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00])



# 返回一个字符串,两个十六进制的字符表示一个byte(Return a string object containing two hexadecimal digits for each byte in the instance)
my_hex = my_bytes.hex()


// Golang

my_bytes := []byte{0x79, 0xa6, 0x1a, 0xdb, 0xc6, 0xe5, 0xa2, 0xe1,
                   0x39, 0xd2, 0x71, 0x3a, 0x54, 0x6e, 0xc7, 0xc8,
                   0x75, 0x63, 0x2e, 0x75, 0xf1, 0xdf, 0x9c, 0x3f,
                   0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}

my_hex = hex.EncodeToString(my_bytes)  // 返回十六进制编码字符串
  • Hex string -> Bytes

# Python:
my_bytes = bytes.fromhex(my_hex)

//  Golang:
my_bytes = hex.DecodeString(my_hex)

 

3.实例

3.1. python protobuf输出hex字符串

python protobuf
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2

import person_pb2 as Person

person1 = Person.Person()
person1.id = 1234
person1.name = "John Doe"
person1.email = "[email protected]"
phone = person1.phones.add()  # phones字段是符合类型,调用add()方法初始化新实例。如果phones字段是标量类型,直接append()添加新元素即可。
phone.number = "555-4321"
phone.type = Person.Person.HOME

persion1Str = person1.SerializeToString()
print("persion1Str,hex", persion1Str.hex())

输出:

persion1Str,hex 0a084a6f686e20446f6510d2091a106a646f65406578616d706c652e636f6d220c0a083535352d343332311001

得到hex字符串

 

3.2. golang protobuf导入hex字符串

go protobuf
 package main

import (
	"encoding/hex"
	"google.golang.org/protobuf/proto"
	"log"
)

func main() {
	var bytes []byte

	hexstr := "0a084a6f686e20446f6510d2091a106a646f65406578616d706c652e636f6d220c0a083535352d343332311001"
	bytes, _ = hex.DecodeString(hexstr)

	person := &Person{}
    if err := proto.Unmarshal(bytes, person); err != nil {
        log.Fatalln("Failed to parse address book:", err)
    }
    fmt.Println(person)
}

输出:

name:"John Doe" id:1234 email:"[email protected]" phones:{number:"555-4321" type:HOME}

测试完成

标签:protobuf,python,hex,0x00,bytes,序列化,my
From: https://www.cnblogs.com/zhanchenjin/p/17175579.html

相关文章

  • Python第 4 天
    所有可以自己起名的都叫做标识符,标识符不可以以数字开头,不能有特殊符号(例如:,&),可以用中文一个变量可以用多个英文单词组成但中间要用_分隔开全部大写的字母定义常量,常量“......
  • python+playwright 学习-21.文件上传-优雅处理
    前言如果你之前用过selenium,肯定遇到过文件上传头疼的事,有些控件是input输入框,可以直接传本地文件地址,然而有些需要弹出本地文件选择器的时候就不好处理了。playwright......
  • 简单介绍Python中如何给字典设置默认值
    这篇文章主要介绍了Python中如何给字典设置默认值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教Python字典设置默认值我们都......
  • python中的__name__变量
    一、__name__1.1这个__name__拿来做什么的?__name__是一个特别的变量,当我们与模块交互时使用,可以让我们区分哪些模块(常指:包和库)导入或者不导入。1.2 这个__name__......
  • python初始化类出现takes no arguments
    初始化类的时候出现了takesnoarguments一般这种问题都是因为初始化函数的问题,例如definit(self):defint(self,name):definit_(self,name):def__init(self,name......
  • Python爬虫之用Selenium做爬虫
    我们在用python做爬虫的时候,除了直接用requests的架构,还有Scrapy、Selenium等方式可以使用,那么今天我们就来聊一聊使用Selenium如何实现爬虫。Selenium是什么?Selenium是......
  • 轻量级CI/CD发布部署环境搭建及使用_05_安装宿主机环境(jdk、nodejs、maven、python2)
    轻量级CI/CD发布部署环境搭建及使用_05_安装宿主机环境(jdk、nodejs、maven、python2)尽自己的绵薄之力,为开源技术分享添砖加瓦本篇幅较多,请按步骤实验安装,截图中涉及的......
  • 180207 python tqdm进度条的使用
    ​​python的Tqdm模块​CodeOnefromtqdmimporttqdmfromtimeimportsleepforiintqdm(range(1000)):sleep(0.1)passCodeTwofromtqdmimporttqdmfrom......
  • python+playwright 学习-20.文件下载expect_download()
    前言文件下载操作expect_download()当浏览器上下文关闭时,所有属于浏览器上下文的下载文件都会被删除。下载开始后会发出下载事件。下载完成后,下载路径可用:withpage.e......
  • python+playwright 学习-19.监听dialog事件-优雅处理对话框
    前言网页上的alert弹出框你不知道什么时候弹出来,selenium处理alert弹出框的方式是先判断有没alert再处理,并且只能处理这一次。playwright框架可以监听dialog事件,不管......