Java 协议消息包含无效标记(零)

Java 协议消息包含无效标记(零),java,protocol-buffers,openstreetmap,Java,Protocol Buffers,Openstreetmap,我正在处理开放街道地图上的pbf文件 我想解析节点、关系和方法 当我试图解析节点时,我得到了这个消息 代码看起来像 package myCode; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import protpbufCode.OsmPbf; import protpbufCode.OsmPbf.Node; import pr

我正在处理开放街道地图上的pbf文件

我想解析节点、关系和方法

当我试图解析节点时,我得到了这个消息

代码看起来像

package myCode;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

import protpbufCode.OsmPbf;
import protpbufCode.OsmPbf.Node;
import protpbufCode.OsmPbf.PrimitiveGroup;


public class ReadingPBF 
{

     public static void print(PrimitiveGroup node)
      {
           for (Node m: node.getNodesList()) 
            {
              System.out.print("Person ID: " + m.getId() + " ");
              System.out.print("  Lat: " + m.getLat()+ " ");
              System.out.print(" Long: "+ m.getLon()+ " ");
              System.out.println("");

            }
      }


    public static void main (String args[])
    {
        try 
        {
            PrimitiveGroup newNode = PrimitiveGroup.parseFrom(new FileInputStream(new         File("isle.pbf")));
            print(newNode);
        }
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println(e.getMessage());
            System.out.println(e.getCause());
        }



    }
}
OsmPbf是使用protobuf编译器创建的java类

这就是印刷出来的东西

com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
at     com.google.protobuf.InvalidProtocolBufferException.invalidTag(InvalidProtocolBufferException.java:89)
at com.google.protobuf.CodedInputStream.readTag(CodedInputStream.java:158)
at protpbufCode.OsmPbf$PrimitiveGroup.<init>(OsmPbf.java:5230)
at protpbufCode.OsmPbf$PrimitiveGroup.<init>(OsmPbf.java:5219)
at protpbufCode.OsmPbf$PrimitiveGroup$1.parsePartialFrom(OsmPbf.java:5329)
at protpbufCode.OsmPbf$PrimitiveGroup$1.parsePartialFrom(OsmPbf.java:1)
at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:192)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:209)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:215)
at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49)
at protpbufCode.OsmPbf$PrimitiveGroup.parseFrom(OsmPbf.java:5627)
at myCode.ReadingPBF.main(ReadingPBF.java:33)


Protocol message contained an invalid tag (zero).

null
com.google.protobuf.InvalidProtocolBufferException:协议消息包含无效标记(零)。
位于com.google.protobuf.InvalidProtocolBufferException.invalidTag(InvalidProtocolBufferException.java:89)
位于com.google.protobuf.CodedInputStream.readTag(CodedInputStream.java:158)
位于protpbufCode.OsmPbf$PrimitiveGroup。(OsmPbf.java:5230)
位于protpbufCode.OsmPbf$PrimitiveGroup。(OsmPbf.java:5219)
位于protpbufCode.OsmPbf$PrimitiveGroup$1.parsePartialFrom(OsmPbf.java:5329)
位于protpbufCode.OsmPbf$PrimitiveGroup$1.parsePartialFrom(OsmPbf.java:1)
位于com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:192)
位于com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:209)
位于com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:215)
位于com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49)
位于protpbufCode.OsmPbf$PrimitiveGroup.parseFrom(OsmPbf.java:5627)
在myCode.ReadingPBF.main(ReadingPBF.java:33)
协议消息包含无效标记(零)。
无效的

OpenStreetMap.pbf文件不是简单的protobuf。请参阅此处的文档:

在“文件格式”部分下,您将看到:

格式是以下内容的重复序列:

  • int4:BlobHeader消息的长度(按网络字节顺序)
  • 序列化BlobHeader消息
  • 序列化Blob消息(大小在标头中给定)
也就是说,文件在第一条protobuf消息之前以一个4字节的整数开始。因为这个整数可能小于2^24,所以第一个字节当然是零,这就解释了您看到的确切异常

您需要手动读取这个4字节的值,然后确保只读取那么多字节,并将它们解析为
BlobHeader
,依此类推


就我个人而言,我建议寻找一个PBF解码器库,它已经为您处理了这个问题。一定有一些。你检查过PBF文件是否损坏了吗?它可以用其他工具阅读吗?是的,我检查过了,它没有坏。