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

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

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

  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)。那么大小应该是 sizeof(myPacket) 。

最佳答案

你写了这个:

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

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

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

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

关于c++ - 通过 Google Protobuf 发送二进制文件数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47208434/

相关文章:

c++ - 在无向树中寻找最长路径

c++ - 用于计算位或找到最右边|最左边的位的高效按位运算

c - 我如何修改这个将十进制 int 转换为二进制 int 的函数,它的每个数字都在一个数组中?

java - 在 shell 脚本中嵌入可执行二进制文件

protocol-buffers - 我可以将 thrift rpc 与 protobuf 一起使用吗

scala - HBase - Scala - 无法初始化类 ProtobufUtil

为c中nanopb中的protobuf消息中的重复字段创建回调和结构

c++ - 用于查找范围重叠的内存效率更高的算法

c++ - 允许模拟类继承自最终类

c++ - 为什么将 "&& true"添加到约束会使函数模板成为更好的重载?