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

Posted

技术标签:

【中文标题】通过 Google Protobuf 发送二进制文件数据【英文标题】:Sending Binary File Data via Google Protobuf 【发布时间】:2017-11-09 17:48:44 【问题描述】:

我的 protobuf 消息似乎设置得很好,我在网络上正确传输的所有其他字段都没有截断。我只有一个问题,当我读取图片或文件的二进制数据然后通过 google 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) 而不是。

【问题讨论】:

考虑ret(指向图像数据的指针)和&ret(指向变量的指针)之间的区别。 sizeof(dataStream) 是 1024。 s/myPacket.set_file(&ret);/myPacket.set_file(ret); 指针部分打错了对不起,大小可能是个问题。 【参考方案1】:

你写过这个:

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

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

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

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

【讨论】:

以上是关于通过 Google Protobuf 发送二进制文件数据的主要内容,如果未能解决你的问题,请参考以下文章

Google Protobuf简明教程

Google Protobuf简明教程

Protobuf-net 应用

google protobuf 数据类型_理解Protobuf数据格式解析

在java程序中使用protobuf

如何通过 C++ 中的 boost 套接字发送 ostream?