我的protobuf消息设置正常,我通过网络正确传输的所有其他字段并没有截断。我只有一个问题,当我读取图片或文件的二进制数据然后通过谷歌protobuf作为字节数组类型发送它,另一方面它只包含数组的前4个元素。如果图片是200kb,另一端是1kb(基本上只包含标题或标识符)。这个问题有点复杂,所以我会试着让一个人失望。对不起,如果我让这个无法理解。我可能会以完全错误的方式解决这个问题。
以下示例包含概念性工作,并在课堂上编写。它很可能包含小错误。代码在家编译,如果是拼写错误,请告诉我,我可以修复它。
FILE* file;
FILE* ofile;
file = fopen("red.png", "rb");
fseek(file, 0, SEEK_END);
long fSize = ftell(file);
rewind(file);
BYTE* ret = new BYTE[fSize];
fread(ret, 1, fSize, file);
fclose(file);
char dataStream[1024] //yes it is large enough
myPacket.set_file(ret);
//set other fields here
myPacket.SerializeToArray(dataStream,sizeof(dataStream));
//send through sockets below, works for all but file field.
当我回到我的主要工作电脑的家时,我可以包括更多,抱歉,我只是希望我能在课堂上炖这种东西。如果这还不够,请随时给我打扰,不过只是寻找建议。我也知道某些图像格式可以通过某种方式读取,但是我能够复制png并通过本地二进制文件重写它,而不是通过protobuf
感谢您阅读我的伪书家伙,我终于试图提高我的知识。
快速键入指针错误(& ret)编辑为(ret)。然后应该是sizeof(myPacket)的大小。
答案 0 :(得分:1)
你写过:
char dataStream[1024] //yes it is large enough
但是如果要将200,000个字节存储到其中,1024字节缓冲区怎么能够足够大呢?
最好在堆上分配更大的缓冲区,例如:
std::vector<char> dataStream(500000);
myPacket.SerializeToArray(&dataStream[0], dataStream.size());