Я пытаюсь понять метод кодирования буфера протокола, при переводе сообщения в двоичный (или шестнадцатеричный) формат я не могу понять, как кодируется встроенное сообщение.
Полагаю, возможно, это связано с адресом памяти, но я не могу найти точное отношение.
Вот что я сделал.
Шаг 1: я определил два сообщения в файле test.proto
,
syntax = "proto3";
package proto_test;
message Education {
string college = 1;
}
message Person {
int32 age = 1;
string name = 2;
Education edu = 3;
}
Шаг 2: А потом я сгенерировал некоторый код go
,
protoc --go_out=. test.proto
Шаг 3: Затем я проверяю закодированный формат сообщения,
p := proto_test.Person{
Age: 666,
Name: "Tom",
Edu: &proto_test.Education{
College: "SOMEWHERE",
},
}
var b []byte
out, err := p.XXX_Marshal(b, true)
if err != nil {
log.Fatalln("fail to marshal with error: ", err)
}
fmt.Printf("hexadecimal format:% x \n", out)
fmt.Printf("binary format:% b \n", out)
какие выходы,
hexadecimal format:08 9a 05 12 03 54 6f 6d 1a fd 96 d1 08 0a 09 53 4f 4d 45 57 48 45 52 45
binary format:[ 1000 10011010 101 10010 11 1010100 1101111 1101101 11010 11111101 10010110 11010001 1000 1010 1001 1010011 1001111 1001101 1000101 1010111 1001000 1000101 1010010 1000101]
что я понимаю,
08 - int32 wire type with tag number 1
9a 05 - Varints for 666
12 - string wire type with tag number 2
03 - length delimited which is 3 byte
54 6f 6d - ascii for "TOM"
1a - embedded message wire type with tag number 3
fd 96 d1 08 - ? (here is what I don't understand)
0a - string wire type with tag number 1
09 - length delimited which is 9 byte
53 4f 4d 45 57 48 45 52 45 - ascii for "SOMEWHERE"
Что означает fd 96 d1 08
?
Кажется, что d1 08
всегда будет там, но fd 96
иногда меняется, не знаю почему. Спасибо за ответ:)
Добавить
Я отладил процесс маршала и сообщил об ошибке здесь .