小编San*_*pta的帖子

用于存储 ipv4 或 ipv6 地址的最有效的 protobuf 类型(在 C++ 中)是什么?我的地址是 boost::asio::ip::address_v4 (or v6)

我读到 protobuf 有一种叫做“字节”的类型,它可以存储任意数量的字节,相当于“C++字符串”。我不喜欢使用“字节”的原因是它期望输入为 C++ 字符串,即,boost IP 需要转换为字符串。现在我关心的是:我想执行序列化并通过 TCP 套接字发送编码的 protobuf 消息。我想确保编码的消息大小尽可能小

目前,我正在使用以下 .proto 文件:

syntax = "proto2";

message profile

{

repeated **uint32** localEndpoint = 1;

repeated **uint32** remoteEndpoint = 2;

}
Run Code Online (Sandbox Code Playgroud)

为了在 protobuf 消息中保存 boost IP,我首先使用“boost::asio::ip::address_v4::to_bytes()”将 boost IP 转换为字节格式数组。因此,对于 v4 IP,结果数组大小为 4。然后我将结果字节数组中的第 1 个 4 字节转换为一个 uint32_t 数字,然后存储在 protobuf 消息的“localEndpoint”字段中。同样,我重复接下来的 4 个字节(对于 v6)。我一次取 4 个字节,以便利用 uint32 的全部 32 位。

因此,对于 v4 地址,使用了 1 次“localEndpoint”字段。类似地,对于 v6 地址,使用了 4 次“localEndpoint”字段。

请允许我强调,如果我在这里使用了“字节”,对于像 111.111.111.111 这样的 v4 ip,我的输入字符串本身的大小将是 15 个字节

使用 …

protocol-buffers boost-asio c++11

3
推荐指数
1
解决办法
2348
查看次数

标签 统计

boost-asio ×1

c++11 ×1

protocol-buffers ×1