python-3.x - 使用协议缓冲区序列化字节 Python3
问题描述
我正在尝试序列化一个字节对象 - 这是我的程序加密的初始化向量。但是,Google 协议缓冲区只接受字符串。似乎错误从将字节转换为字符串开始。我是否使用正确的方法来做到这一点?感谢您的任何帮助或指导!
或者,我可以将初始化向量设为 AES-CBC 模式加密的字符串对象吗?
代码
- 将字节转换为字符串
string_iv = str(bytes_iv, 'utf-8')
- 使用 SerializeToString() 序列化字符串:
serialized_iv = IV.SerializeToString()
- 使用 ParseToString() 恢复字符串:
IV.ParseFromString( serialized_iv )
- 最后,UTF-8 将字符串编码回字节:
bytes_iv = bytes(IV.string_iv, encoding= 'utf-8')
错误
string_iv = str(bytes_iv, 'utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9b in position 3: invalid start byte
解决方案
如果您必须将任意bytes
对象转换为str
,这些是您的选择:
- 只需调用
str()
对象。它将把它变成repr
形式,即。可以被解析为bytes
文字的东西,例如。"b'abc\x00\xffabc'"
- 用“latin1”解码。这将始终有效,即使如果数据不是用 Latin-1 编码的文本从技术上讲是没有意义的。
- 使用 base64 或 base85 编码(标准库有一个
base64
涵盖两者的模块)
推荐阅读
- tensorflow - 使用 GOOGLE COLAB TPU 在 IMAGENET 上训练 VGG-16 模型需要多长时间?
- haskell - 类型签名 a -> b -> a 和 c -> a -> c 之间有区别吗?
- javascript - 排序算法以找到具有多个值约束的最佳选项
- kotlin - 从其他用户日历获取事件
- javascript - Uncaught Invariant Violation:React.Children.only 期望接收单个 React 元素子元素
- python - 如何在 travis 配置文件中声明文件?
- swift - 从 uiview 的子类中的 CGPoint 线更改颜色
- syntax - 这个变量的语法应该写什么?
- r - 如何绘制包含 4 只股票回报的 XTS?
- algorithm - 为什么这是这个时间复杂度分析问题的答案?