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

时间:2017-11-09 17:48:45

标签: c++ binary protocol-buffers tcpclient file-transfer

我的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

  2. 感谢您阅读我的伪书家伙,我终于试图提高我的知识。

    快速键入指针错误(& ret)编辑为(ret)。然后应该是sizeof(myPacket)的大小。

1 个答案:

答案 0 :(得分:1)

你写过:

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

但是如果要将200,000个字节存储到其中,1024字节缓冲区怎么能够足够大呢?

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

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