python - 如何正确地将 uint32 传递给 Python 中的 Protobuf 对象?
问题描述
很长一段时间我都无法在 Internet 上找到解决此问题的方法。不得不说,要改变特定字段的数据类型是不可能的,因为产品已经发布了,没有办法替代对 Protobuf 消息的解码或者完全放弃 Protobuf :(
问题在于,编号 5 的 Protobuf 数据类型仅接受标准 Python int,由于它不是无符号 int,因此它可能太大。
我尝试使用 numpy。uint32 和 ctypes。c_uint32,但两个选项最终都会自动转换为常规 Python int,我收到错误:“ValueError:值超出范围:2902080034”。我需要以某种方式将 UUID4 的前 32 位作为数字放入第 5 个 Protobuf 数据类型。
我希望得到帮助,提前谢谢你。不幸的是,在我看来,这可能是一个以前没有在这里描述过的流行问题。
解决方案
类型.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?
推荐阅读
- docker - Docker swarm leave --force - 超出上下文截止日期
- kubernetes - Prometheus 警报规则:将表达式中的指标与标签中的值进行比较
- repository - 带有 CQRS 的 DDD 中的通用存储库模式,有意义吗?
- javascript - Flatlist 不会显示来自 json 的图像(React Native)
- java - 忽略可选的@Query 参数
- spring-boot - 为什么我在使用 IgniteRepository 的 deleteAll 方法时遇到问题?
- adobe-analytics - Adobe Analytics 中的子域跟踪
- html - css 网格创建具有自动填充功能的空列
- c# - 添加 Outlook 日历条目时无法设置开始和结束时间
- php - 递归 PHP 编程:在函数结束时调用函数