Python 语言引导

本文将介绍如何在 Python 语言中使用 bitproto 。

前提

bitproto 生成的 Python 代码是基于 Python3 的,因为使用了 typing hintdataclasses. 因此,请确保你在使用 Python3.7+

编译 bitproto 生成 Python 文件

首先,执行 bitproto 的编译器来生成 Python 语言的代码:

$ bitproto py pen.bitproto

其中, pen.bitproto 已经在前面的章节 一个示例 bitproto 中做过说明。

我们会发现 bitproto 会在当前目录生成一个文件叫做 pen_bp.py ,其中包含了映射后的 class,常量和一些方法接口。

在生成的 pen_bp.py 文件中:

  • The enum Color in bitproto is mapped to an enum.IntEum class, and the enum values are mapped to constants as well:

    @unique
    class Color(IntEnum): # 3 bit
       COLOR_UNKNOWN = 0
       COLOR_RED = 1
       COLOR_BLUE = 2
       COLOR_GREEN = 3
    
    COLOR_UNKNOWN: Color = Color.COLOR_UNKNOWN
    COLOR_RED: Color = Color.COLOR_RED
    COLOR_BLUE: Color = Color.COLOR_BLUE
    COLOR_GREEN: Color = Color.COLOR_GREEN
    
  • bitproto 中的 Timestamp 类型也被映射成为了一个 typing hint 的别名类型:

    Timestamp = int # 64bit
    
  • bitproto 中的 message Pen 映射成为了一个被 dataclass 装饰的类:

    @dataclass
    class Pen(bp.MessageBase):
        BYTES_LENGTH: ClassVar[int] = 9
        color: Color = 0 # 3bit
        produced_at: Timestamp = field(default_factory=bp_default_factory_Timestamp) # 64bit
    
  • 编译器同样生成了 Pen 的两个方法,一个是编码函数,另一个是解码函数:

    def encode(self) -> bytearray:
        pass
    
    def decode(self, s: bytearray) -> None:
        pass
    

安装 bitproto 的 Python 支持库

bitproto 序列化需要依赖目标语言的支持库来工作,在这里,我们生成的编解码函数依赖 bitproto 的 Python 语言支持库。

通过 pip 来安装:"

$ pip install bitprotolib

bitproto 的 Python 支持库的代码存在在 Github 上。

运行代码

现在,创建一个叫做 main.py 的文件,包含代码如下:

import pen_bp as bp

# Encode
p = bp.Pen(color=bp.COLOR_RED, produced_at=1611515729966)
s = p.encode()

# Decode
p1 = bp.Pen()
p1.decode(s)

# Print in json format
print(p1.to_json())

在上面的代码中,我们首先创建了一个 Pen 的实例 p ,并做了数据的初始化,随后执行了一个叫做 p.encode() 的函数,把 p 的数据编码到字节流 s 中,返回的 s 是一个 bytearray

在解码的部分,我们创建了另一个实例 p1 ,然后调用 p1.decode() 方法,把字节流 s 中的数据解码到 p1

编译器同样生成了一个叫做 to_json() 的方法来输出结构化数据的 json 格式字符串。

现在执行它:

$ python main.py
{"color": 1, "produced_at": 1611515729966}