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



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

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

我正在使用CPP实现服务器和Java客户端。在 Java 中使用 ByteString 是轻而易举的,但不能在 CPP 中反序列化(byte[] 从 Java 发送的内容更改)。

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

这是 CPP 的反序列化代码。这里 "req" 是一个 myType 对象,缓冲区是一个字节[]

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

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

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

请检查服务器端数组的长度是否不为零。请注意,字节是字符数组,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";

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

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

最新更新