gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:58:40 26 4
gpt4 key购买 nike

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

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

syntax = "proto2";

message profile

{

repeated **uint32** localEndpoint = 1;

repeated **uint32** remoteEndpoint = 2;

}

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

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

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

使用 uint32 而不是“字节”确实为我节省了一些编码数据大小,但我正在寻找一种更有效的 protobuf 类型,需要更少的字节数。

抱歉,描述很长,但我想详细解释我的查询。请帮助我..提前非常感谢:)

最佳答案

一个 ipv4 地址应该正好需要 4 个字节。如果你以某种方式得到 8,那么你做错了什么 - 你可能是十六进制编码吗?你在这里不需要那个。同样,ipv6 应该是 16 字节。

具有通常设置的高字节的 4 字节最有效地存储为 fixed32 - 由于高位,varint 在此处将是开销。 16 字节更微妙 - 我会选择 bytes (字段头加上长度),因为它更容易形成一个联合,并且如果字段号很大,它可以避免支付对于多个多字节字段头(长度前缀 16 将始终是单字节)。

然后我会通过 oneof 创建这些的联合:

oneof ip_addr {
fixed32 v4 = 1;
bytes v6 = 2;
}

关于c++11 - 用于存储 ipv4 或 ipv6 地址的最有效的 protobuf 类型(在 C++ 中)是什么?我的地址是 boost::asio::ip::address_v4(或 v6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51395679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com