使用字节数组时,我在使用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格式
答案 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;
};