通过Google Protobuf发送二进制文件数据



我的protobuf消息设置得很好,似乎所有其他字段都可以通过网络正确传输,并且不会截断。我只有一个问题,当我读取图片或文件的二进制数据,然后通过谷歌protobuf将其作为字节数组类型发送时,另一方面,它只包含数组的前4个元素。如果图片是200kb,那么在另一端,它显示为1kb(基本上只包含标题或标识符)。这个问题有点复杂,所以我会试着做一个分析。对不起,如果我让你无法理解。我可能完全错了方向。

  1. 下面的例子包含概念性的工作,是在课堂上写的。它很可能包含小错误。代码在家里编译,如果是拼写错误,请告诉我,我可以修复它。

    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)。同样,size of应该是size of(myPacket)。

您已经编写了以下内容:

char dataStream[1024] //yes it is large enough

但是,如果您想在其中存储20万字节,1024字节的缓冲区怎么可能足够大呢?

更好地在堆上分配更大的缓冲区,例如:

std::vector<char> dataStream(500000);
myPacket.SerializeToArray(&dataStream[0], dataStream.size());

最新更新