I have two programs that exchange information via protocol buffers serialization. One of my data fields is in protobuf's bytes
format, and it somehow has a few extra bytes after decoding.
That said, 0xDEADBEEF0123456789
becomes 0xFFFFFFDEFFFFFFADFFFFFFBEFFFFFFEF01234567FFFFFF89
.
My messages.proto
file:
syntax = "proto3";
message RawPacket {
uint32 version = 1;
oneof proto_trait {
string protocol = 2;
uint32 tcpport = 4;
uint32 udpport = 5;
};
bytes data = 3;
}
The encoder code in python:
import sys
import protocol.messages_pb2 as pb
...
payload = bytes.fromhex('deadbeef0123456789')
msg = pb.RawPacket()
msg.version = 1
msg.protocol = "Frame"
msg.data = payload
with open(sys.argv[1], 'wb') as f:
f.write(msg.SerializeToString())
The decoder code in C++:
#include <fstream>
#include <iostream>
#include "protocol/messages.pb.h"
std::fstream inputfile{"some filename", std::ios::in | std::ios::binary};
RawPacket input;
if (!input.ParseFromIstream(&inputfile)) {
std::cerr << "Could not parse raw packet." << std::endl;
return 2;
}
// input.data() is a const std::string&, and I think that's suspicious.
for (char c : input.data()) {
printf("%.2X", c);
}
std::cout << std::endl;
Any idea is appreciated.