在GRPC中使用字节数组(cpp)

时间:2017-07-05 12:50:23

标签: c++ protocol-buffers grpc

使用字节数组时,我在使用GRPC时遇到了很多麻烦。这是由.proto

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

我正在使用CPP for Server实现和Java for Client。在Java中使用ByteString是一件轻而易举的事,但无法在CPP中反序列化(byte []正在从Java发送的内容中更改。)

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

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

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

据我所知,req-&gt; data()采用cpp std :: string格式

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

检查服务器端阵列的长度是否不为零。请注意,bytes是char数组,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()}

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

const char mat[12] = "sdsd";

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

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