【问题标题】:Using byte array (cpp) in GRPC在 GRPC 中使用字节数组 (cpp)
【发布时间】:2017-07-05 12:50:22
【问题描述】:

在使用字节数组时,我在使用 GRPC 时遇到了很多问题。这是由 .proto 编写的

message myType {
    int32 format = 1;
    bytes data = 2;
}

我将 CPP 用于服务器实现,将 Java 用于客户端。在 Java 中使用 ByteString 是一件轻而易举的事,但不能在 CPP 中反序列化(byte[] 与从 Java 发送的内容不同)。

缓冲区是一个字节[] byte buffer[<large_size>] 我正在将字节数组(它是一个图像)转换为一个较小的字节数组,并且在尝试转换从 grpc 接收到的字节 [] 时它崩溃了。 CPP中的转换功能很好,因为我在使用GRPC之前将它与相同的图像一起使用过

这是 CPP 的反序列化代码。这里的“req”是一个myType对象,buffer是一个byte[]

myFormat = req->format();
dataLen = req->data().length();
memcpy(buffer, req->data().c_str(), dataLen);

据我了解,req->data() 是 cpp std::string 格式

【问题讨论】:

  • “无法成功反序列化”是什么意思?发生什么了?发布任何错误、崩溃 + 堆栈跟踪、预期输出与接收到的输出,否则“失败”会表现出来
  • 在缓冲区字节数组中获取错误/无效数据
  • 您需要提供minimal reproducible example(例如:尚不清楚buffer 是如何分配的以及您如何检查收到的数据)
  • buffer is a byte[] byte buffer[<large_size>] 我正在将字节数组(它是一个图像)转换为一个较小的字节数组,当尝试转换从 grpc 接收到的 byte[] 时它崩溃了. CPP中的转换功能很好,因为我在使用GRPC之前将它与相同的图像一起使用过

标签: c++ protocol-buffers grpc


【解决方案1】:

在客户端,您应该同时传递参数及其长度。 parameter.set_framemat(mat, 12);

【讨论】:

    【解决方案2】:

    请检查服务器端的数组长度是否不为零。请注意,字节是字符数组,而 grpc 将其编组为字符串。因此,如果说数组中填充了空字符,则数据长度为零。

    我正在尝试类似的用例

    原始文件

    message Parameters {
          bytes framemat = 16; 
    };
    

    客户端片段

    const char mat[12] = {0}
    parameter.set_framemat(mat);
    stream->Write(parameter);
    

    服务器片段

    std::thread reader([&]() {
    
        ::nokia::nas::Parameters request;
        while (stream->Read(&request))
        {
          //get the params
           grpc::string mat = request.framemat();
          logger->info(" Length of Bytes= {} , mat.length()}
    

    输出为零! 所以我更改了客户端输入以检查一些 char 字符串,并且确定服务器端的数据长度为 4;因为这一次是一个有效的字符串和字符串长度匹配。

    const char mat[12] = "sdsd";
    

    更好的方法是在 proto 中指定数据以及数据长度

    message StreamBytes { 
      bytes data_bytes =1;
      int32 data_length = 2;
    };
    

    【讨论】:

    • 实际上,如果我零填充数组并发送,它并没有真正发送;如果第一个字符不为零,则它可以工作 mat[0] ='A'; -> 好的垫子[1] = 'B'; -> 不正常;如果 mat 初始化为零,则不会传输 - stackoverflow.com/questions/531477/…(奇怪)
    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2011-06-28
    • 2013-07-11
    • 2021-01-01
    相关资源
    最近更新 更多