使用pb3的Python pb3序列化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用pb3的Python pb3序列化相关的知识,希望对你有一定的参考价值。

我正在使用pb3进行序列化:

syntax = "proto3";

package marshalling;

import "google/protobuf/timestamp.proto";

message PrimitiveType {
  oneof primitive_value {
    bool boolean_value = 1;
    int64 int_value = 2;
    double double_value = 3;
    google.protobuf.Timestamp timestamp_value = 4;
  }
}

我生成了一个x_pb2.py文件,但不知道如何使用。

例如,如果我想将时间戳记编组为字节,我该怎么办?

答案

参考The Protocol Buffer API部分:

与生成Java和C ++协议缓冲区代码时不同,Python协议缓冲区编译器不会直接为您生成数据访问代码。相反,它为您的所有消息,枚举和字段以及一些神秘的空类生成特殊的描述符,每种消息类型一个...

在加载时,GeneratedProtocolMessageType元类使用指定的描述符来创建您需要使用每种消息类型的所有Python方法,并将它们添加到相关的类中。然后,您可以在代码中使用完全填充的类。

因此,您可以使用生成的类来创建对象及其字段,如下所示:

p1 = primitive_types_pb2.PrimitiveType()
p1.int_value = 1234

对于您的用例,可以使用timestamp_pb2.Timestamp.GetCurrentTime()

或者,您可以与Timestamp一起参考timestamp_pb2.Timestamp.CopyFrom()

now = time.time()
seconds = int(now)
nanos = int((now - seconds) * 10**9)
timestamp = Timestamp(seconds=seconds, nanos=nanos)

p1 = primitive_types_pb2.PrimitiveType()
p1.timestamp_value.CopyFrom( timestamp )

[您可能会对其他用例感兴趣的其他google.protobuf.timestamp_pb2 API。


这是一个完整的工作示例(primitive_types.proto):

import time  # For Timestamp.CopyFrom(). See commented code below
import primitive_types_pb2
from google.protobuf import timestamp_pb2

# serialization

p1 = primitive_types_pb2.PrimitiveType()

# Alternative to GetCurrentTime()
# now = time.time()
# seconds = int( now )
# nanos = int( (now - seconds) * 10**9 )
# timestamp = timestamp_pb2.Timestamp( seconds=seconds, nanos=nanos )
# p1.timestamp_value.CopyFrom( timestamp )

p1.timestamp_value.GetCurrentTime()

serialized = p1.SerializeToString()

# deserialization

p2 = primitive_types_pb2.PrimitiveType()
p2.ParseFromString( serialized )

print( p2.timestamp_value )

输出:

seconds: 1590581054
nanos: 648958000

参考:

以上是关于使用pb3的Python pb3序列化的主要内容,如果未能解决你的问题,请参考以下文章

GPIO初始化之PB3/PB4/PA13/PA14/PA15引脚的复用--寄存器版本

STM32的PB3口不能拉低 PB4口不能拉高 其他口貌似都可以 怎么会

如何将STM32的调试口设置为普通IO口

STM32C8T6 JTAG使用到PB3|PB4|PA13|PA14|PB15端口做普通IO时,需禁止JTAG!

求stm32高手,我想用pb3当普通io口,为啥不成功呢?,看资料上显示,开启sw,关闭jtag就可以啊

STM32库中关于GPIO_PinRemapConfig函数的使用