ParseFromString 返回二进制文件的文件大小,而不是数据

ParseFromString returning filesize of binary file, not data

我正在尝试使用 Google 协议缓冲区从二进制文件(特别是 OnlineSequencer 的新序列文件格式)获取数据,但它打印的只是文件大小。我已经将它使用的两个 .proto 文件编译成 python 脚本: sequence.proto:

    syntax = "proto3";

import "note_type.proto";

message Note {
  NoteType type = 1;
  float time = 2;
  float length = 3;
  int32 instrument = 4;
  float volume = 5;
}

message Marker {
  float time = 1;
  int32 setting = 2;
  int32 instrument = 3;
  float value = 4;
  bool blend = 5;
}

message InstrumentSettings {
  float volume = 1;
  bool delay = 2;
  bool reverb = 3;
  float pan = 4;
  bool enable_eq = 5;
  float eq_low = 6;
  float eq_mid = 7;
  float eq_high = 8;
  float detune = 9;
}

message SequenceSettings {
  int32 bpm = 1;
  int32 time_signature = 2;
  map<int32, InstrumentSettings> instruments = 3;
  // Storing volume as (1 - volume) so it defaults to volume=1.
  float one_minus_volume = 4;
}

message Sequence {
  SequenceSettings settings = 1;
  repeated Note notes = 2;
  repeated Marker markers = 3;
}

note_type.proto:

syntax = "proto3";

enum NoteType {
  C0 = 0;
  CS0 = 1;
  D0 = 2;
  DS0 = 3;
  E0 = 4;
  F0 = 5;
  FS0 = 6;
  G0 = 7;
  GS0 = 8;
  A0 = 9;
  AS0 = 10;
  B0 = 11;
  C1 = 12;
  CS1 = 13;
  D1 = 14;
  DS1 = 15;
  E1 = 16;
  F1 = 17;
  FS1 = 18;
  G1 = 19;
  GS1 = 20;
  A1 = 21;
  AS1 = 22;
  B1 = 23;
  C2 = 24;
  CS2 = 25;
  D2 = 26;
  DS2 = 27;
  E2 = 28;
  F2 = 29;
  FS2 = 30;
  G2 = 31;
  GS2 = 32;
  A2 = 33;
  AS2 = 34;
  B2 = 35;
  C3 = 36;
  CS3 = 37;
  D3 = 38;
  DS3 = 39;
  E3 = 40;
  F3 = 41;
  FS3 = 42;
  G3 = 43;
  GS3 = 44;
  A3 = 45;
  AS3 = 46;
  B3 = 47;
  C4 = 48;
  CS4 = 49;
  D4 = 50;
  DS4 = 51;
  E4 = 52;
  F4 = 53;
  FS4 = 54;
  G4 = 55;
  GS4 = 56;
  A4 = 57;
  AS4 = 58;
  B4 = 59;
  C5 = 60;
  CS5 = 61;
  D5 = 62;
  DS5 = 63;
  E5 = 64;
  F5 = 65;
  FS5 = 66;
  G5 = 67;
  GS5 = 68;
  A5 = 69;
  AS5 = 70;
  B5 = 71;
  C6 = 72;
  CS6 = 73;
  D6 = 74;
  DS6 = 75;
  E6 = 76;
  F6 = 77;
  FS6 = 78;
  G6 = 79;
  GS6 = 80;
  A6 = 81;
  AS6 = 82;
  B6 = 83;
  C7 = 84;
  CS7 = 85;
  D7 = 86;
  DS7 = 87;
  E7 = 88;
  F7 = 89;
  FS7 = 90;
  G7 = 91;
  GS7 = 92;
  A7 = 93;
  AS7 = 94;
  B7 = 95;
  C8 = 96;
  CS8 = 97;
  D8 = 98;
  DS8 = 99;
  E8 = 100;
  F8 = 101;
  FS8 = 102;
  G8 = 103;
  GS8 = 104;
  A8 = 105;
  AS8 = 106;
  B8 = 107;
}

主要脚本:

import sequence_pb2
f = open('./test.sequence', 'rb')
print(f)
sequence = sequence_pb2.Sequence()
print(sequence)
print(sequence.ParseFromString(f.read()))
f.close()

我不确定为什么这不起作用。如果我在脚本的文件夹中有一个文件,它只会打印文件的大小(以字节为单位)。过去我从来没有真正对二进制文件做过很多工作,所以我对这类东西很陌生。如果我能得到这方面的帮助,那就太好了。

ParseFromString 方法 returns 已解析的字节数(参见 doc),并将内容存储在实例本身中。

您可能想在解析后查看 sequence 对象的内容:

sequence = sequence_pb2.Sequence()
sequence.ParseFromString(f.read())
print(sequence)