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)
我正在尝试使用 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)