Protocol Buffer 四 整数序列化

varints用于正整数 (无符号整数)

varints 是 一个很不错的技术。将一个整数序列化成1或者多个字节。想起以前我们总是使用4字节表示整数,真的很浪费啊。只有真正追求完美的人才会重视每个细节。

我的本篇介绍是https://developers.google.com/protocol-buffers/docs/encoding中的Base 128 Varints一节的逆过程。这么好的站点被墙了,幸好我有VPN。



规则:

1.如果整数可以用一个字节表示,不要改变它
2.否则,用上面的4步序列化
3.每个字节最高位叫msb(most significant bit),1表示后面有字节,0表示后面没有字节。


ZigZag用于负整数(有符号的整数)

但是这种varints encoding算法用来处理负数是不合适的。因为它会把负数当作很大的正数,从而通常序列化成10字节。显然效率比较低。

遇到负数的时候,应该采用另一种encoding算法。


如果是32位符号负整数,用

(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 Protocol Buffers(简称为 Protobuf)进行整数序列化时,你需要定义一个 Protobuf 消息类型,并在其中包含一个整数字段。下面是一个示例: ```protobuf syntax = "proto3"; message IntegerMessage { int32 value = 1; } ``` 在上面的示例中,我们定义了一个名为 `IntegerMessage` 的消息类型,它包含一个名为 `value` 的整数字段。 接下来,你需要使用 Protobuf 编译器将这个 `.proto` 文件编译成你所使用的编程语言的代码。编译后的代码将提供用于序列化和反序列化消息的方法。 以下是使用 Python 进行整数序列化的示例代码: ```python import IntegerMessage_pb2 # 创建一个 IntegerMessage 实例并设置 value 值 message = IntegerMessage_pb2.IntegerMessage() message.value = 42 # 序列化消息为字节流 serialized_data = message.SerializeToString() # 将字节流保存到文件中 with open('serialized_data.bin', 'wb') as f: f.write(serialized_data) ``` 在上面的示例中,我们先导入生成的 Protobuf 代码。然后,我们创建一个 `IntegerMessage` 实例并设置 `value` 值为 42。接下来,我们调用 `SerializeToString()` 方法将消息序列化为字节流,并将其保存到文件中。 当你需要反序列化时,可以使用以下示例代码: ```python import IntegerMessage_pb2 # 从文件中读取序列化的数据 with open('serialized_data.bin', 'rb') as f: serialized_data = f.read() # 反序列化字节流为 IntegerMessage 实例 message = IntegerMessage_pb2.IntegerMessage() message.ParseFromString(serialized_data) # 访问 value 字段的值 value = message.value print(value) # 输出:42 ``` 在上面的示例中,我们从文件中读取序列化的数据,并使用 `ParseFromString()` 方法将其反序列化为 `IntegerMessage` 实例。你可以通过访问 `value` 字段来获取整数值。 这是一个简单的示例,你可以根据你的具体需求和编程语言来调整代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值