protocol-buffers - "Failed to parse input"来自 Google protocol buffers `` 的 protoc 命令 --decode_raw ``

标签 protocol-buffers protoc

我有一个 google protobuf file来自 OpenStreetMap ,特别是我有 1.4MB Liechtenstein country extract from Geofabrik . protoc 命令表示它使用 --decode_raw 选项“将原始标记/值写入标准输出”。但是我不断收到此错误:

$ cat liechtenstein-latest.osm.pbf | protoc --decode_raw
Failed to parse input.

我已经直接从 Google 编译并安装了 protobuf 库,当前版本为 2.6.1。

这个文件是有效的,各种读取 pbf 文件的 OpenStreetMap 工具( osm2pgsql , osmosis )都可以很好地读取它。

有什么问题吗?我怎样才能让 --decode_raw 工作?我做错了什么吗?

最佳答案

OpenStreetMap .osm.pbf 格式不是原始 Protocol Buffer 。格式记录在此处:

http://wiki.openstreetmap.org/wiki/PBF_Format

关键引述:

The format is a repeating sequence of:

  • int4: length of the BlobHeader message in network byte order
  • serialized BlobHeader message
  • serialized Blob message (size is given in the header)

所以你需要先读取四个字节,将它们解释为整数(大端),然后读取那么多字节并解析为 BlobHeader,然后它会告诉你有多少作为 Blob 读取和解析的字节。

protoc 工具不会自动执行此操作,因为它不知道这种格式。可能有一个特定于 OSM 的工具可供您使用。

关于protocol-buffers - "Failed to parse input"来自 Google protocol buffers `` 的 protoc 命令 --decode_raw ``,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35365794/

相关文章:

protocol-buffers - 在 protobuf3 中发送显式零

c++ - 是否可以使用 Varint32 大小前缀的 Protocol Buffer 消息实现类似 'FileInputStream::BackUp()' 的功能?

c++ - 如何在 C++ 中将字节数组发送到另一个进程

Android 和 Protocol Buffer

hadoop - 即使在我的系统上设置了 protoc 2.5.0,构建 hadoop 仍然失败

protocol-buffers - 如何从 protobuf 描述符获取方法选项?

go - 如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf 结构中?

c++ - 如何在 XML 中格式化 Google Protocol Buffers 对象并从 XML 中解析

python-3.x - 使用 Python 的 Protocol Buffer 选择使用 SerializeToString 的数据顺序

java - 使用 Gradle 自动生成 gRPC stub 文件时出现问题