首页 > 解决方案 > 如何正确地将 uint32 传递给 Python 中的 Protobuf 对象?

问题描述

很长一段时间我都无法在 Internet 上找到解决此问题的方法。不得不说,要改变特定字段的数据类型是不可能的,因为产品已经发布了,没有办法替代对 Protobuf 消息的解码或者完全放弃 Protobuf :(

问题在于,编号 5 的 Protobuf 数据类型仅接受标准 Python int,由于它不是无符号 int,因此它可能太大。

我尝试使用 numpy。uint32 和 ctypes。c_uint32,但两个选项最终都会自动转换为常规 Python int,我收到错误:“ValueError:值超出范围:2902080034”。我需要以某种方式将 UUID4 的前 32 位作为数字放入第 5 个 Protobuf 数据类型。

我希望得到帮助,提前谢谢你。不幸的是,在我看来,这可能是一个以前没有在这里描述过的流行问题。

标签: pythontypesprotocol-buffers

解决方案


类型.proto uint32对应于 python int,即它的范围是 -2147483648 到 2147483647。

一种解决方案是通过以下方式将您的无符号 32 位值转换为有符号值:

if (value & 0x80000000):
    value = -0x10000000 + value

转换如下所示:
How to get the signed integer value of a long in python?


推荐阅读