protocol-buffers - Protobuf 校验和 (crc)

标签 protocol-buffers crc

我要将一些大对象存储到数据库 (BLOB) 中。在我看来,protobuf 是序列化/反序列化 BLOB 的最佳候选者之一。尽管它具有二进制格式,但它仍然易于阅读和更改其内容(字符串、整数等)。所以我需要某种数据验证,无论何时它的原始 BLOB 或修改(由黑客?由太聪明的用户?)。

一种可能性是在表中有一个专用字段,称之为 crc ,计算 BLOB 的校验和并将其放在那里。但是当 crc 是 BLOB 本身的一部分时,它会好得多(在许多情况下)。

我可以在 protobuf 流的末尾添加额外的字节,但我必须删除它们(否则反序列化器将抛出异常“无效字段 blablabla”)。

我可以将 protobuf 流放入包装器中,但解包/包装又是开销。

是否有一种简单而廉价的方法可以在 protobuf 流的末尾添加一些东西,以避免在反序列化过程中需要额外的操作?在 XML 中,我可以添加注释。我认为 protobuf 中没有注释,但是如何将 1 个或 2 个字节的 CRC 放在示例中?

最佳答案

Protobuf 流是可附加的。如果您知道数据中不存在的字段编号,则可以简单地针对该字段附加数据。如果您打算添加 1 或 2 个字节的 CRC 数据,那么“varint”可能是您最好的选择(请注意,“varint”是一种 7 位编码格式,第 8 位是延续标记,因此您可能想要使用7、14 或 21 位或实际 CRC 数据),然后您可以附加:

  • 选择的字段编号,左移 3 位,然后 varint 编码
  • CRC 数据,varint 编码

  • 然而!问题在于解码器仍然会经常解释和存储这些数据,这意味着如果您对其进行序列化,它将在输出中包含这些数据。

    另一种避免这种情况的方法是将 protobuf 数据封装在您自己设计的某种框架机制中。例如,您可以选择执行以下操作:
  • 4 个字节表示 protobuf 负载长度,“n”
  • protobuf 有效负载的“n”个字节
  • 在“n”个字节上计算的 2 个字节的 CRC 数据

  • 我可能会选择第二个选项。请注意,如果需要,您可以为长度前缀选择“varint”编码而不是固定长度编码。不过对于 CRC 来说可能不值得,因为 定长。

    关于protocol-buffers - Protobuf 校验和 (crc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22781849/

    相关文章:

    c# - Modbus通讯

    以字(16 位)作为基本变量计算 CRC

    python-2.7 - python protobuf 安装为 windows

    Tensorflow 对象检测训练被杀死,资源匮乏?

    c++ - 是否可以在 protobuf 中发送已编译的 protobuf 消息定义?

    c++ - 查找使用了哪个校验和

    c - 如何在文件末尾添加 2 字节 CRC

    java - 二进制除法问题 : bad examples on internet or what am I missing?

    python - 用Python读取jpeg文件,将其编码为Unicode并放入protobuf中

    protocol-buffers - Google protobuf和大型二进制Blob