C++ 如何使用C/C+通过gRPC发送字节数据+;?

C++ 如何使用C/C+通过gRPC发送字节数据+;?,c++,grpc,C++,Grpc,所以我使用gRPC将数据存储在键值存储中 protos看起来像这样: syntax = "proto3"; package keyvaluestore; service KeyValueStore { rpc AddUser(Credentials) returns (Response) {} rpc Get(Request) returns (Response) {} rpc Put(Request) returns (Response) {} rpc

所以我使用gRPC将数据存储在键值存储中

protos看起来像这样:

syntax = "proto3";

package keyvaluestore;

service KeyValueStore {
  rpc AddUser(Credentials) returns (Response) {}
  rpc Get(Request) returns (Response) {}
  rpc Put(Request) returns (Response) {}
  rpc Cput(Request) returns (Response) {}
  rpc Delete(Request) returns (Response) {}
}

message Credentials {
  string user = 1;
  string passwd = 2;
}

message Request {
  string user = 1;
  string key = 2;
  bytes val = 3;
  bytes val2 = 4;
  string addr = 5;
  string command = 6;
}

message Response {
  bytes val = 1;
  uint32 nbytes = 2;
  string message = 3;
}
现在的问题是,如果我们发送一个图像作为字节数据,可以包含空字节,那么当服务器在
请求
对象中接收到它时,它将其视为一个字符串;当它这样做时,它只读取第一个空字节

如何在客户端打包
请求
对象:

bool KeyValueStoreClient::Put(const string& user, const string& key, const char* val) {
  Request req;
  req.set_user(user);
  req.set_key(key);
  req.set_val(val);

  ClientContext ctx;
  Response res;
  Status status = stub_->Put(&ctx, req, &res);
}
服务器以字符串形式接收
req->val()
,而不是
char*

Status KeyValueStoreServiceImpl::Put(ServerContext* ctx, const Request* req, Response* res) {
  // req->val() is a string

}

在方法
Put
中,
val
参数是
const char*
,而不是
std::string

Protobuf说,当使用
const char*
设置值时(
void set\u foo(const char*value)
重载),它使用第一个
\0
作为终止符


使用
void set\u foo(const char*value,int size)
重载显式告诉它大小。

它将其视为字符串;当它这样做时,它只读取第一个空字节
这不是
std::string
的工作方式;它可以在中间包含空字节,你的答案很快就能解开很多信息,很好!从上面重载函数的文档中可以看出:“字符串大小是显式给定的,而不是通过查找空终止符字节来确定的”。