存储IPv4或IPv6地址最有效的协议类型(在C++中)是什么?我的地址是Boost::ASIO::IP::Address_v4(或v6) [英] What is the most efficient protobuf type (in C++) for storing ipv4 or ipv6 address? My address is a boost::asio::ip::address_v4 (or v6)

查看:28
本文介绍了存储IPv4或IPv6地址最有效的协议类型(在C++中)是什么?我的地址是Boost::ASIO::IP::Address_v4(或v6)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到Protobuf有一个名为"bytes"的类型,它可以存储任意数量的字节,相当于"C++字符串"。我不喜欢使用"bytes"的原因是它希望输入为C++字符串,即Boost IP需要转换为字符串。现在我的关注点在于:我想执行序列化,并通过TCP套接字发送编码后的协议缓冲区消息。我希望确保编码邮件大小尽可能小

我目前使用的是以下.proto文件:

syntax = "proto2";

message profile

{

repeated **uint32** localEndpoint = 1;

repeated **uint32** remoteEndpoint = 2;

}

为了在protocol buf消息中保存Boost IP,我首先使用"Boost::ASIO::IP::Address_v4::to_Bytes()"将Boost IP转换为字节格式的数组。因此,对于v4IP,结果数组大小为4。然后,我将结果字节数组中的前4个字节转换为一个uint32_t数字,然后将其存储在protocol buf消息的"localEndpoint"字段中。同样,我对接下来的4个字节重复(对于V6)。我一次取4个字节,以便充分利用uint32的全部32位。

因此,对于v4地址,使用1次"localEndpoint"字段。 同样,对于V6地址,使用出现4次"localEndpoint"字段。

请允许我强调,如果我在这里使用了"bytes",对于111.111.111.111这样的v4 IP,我的输入字符串本身的大小应该是15个字节

使用uint32而不是"bytes"确实为我节省了一些编码数据大小,但我正在寻找需要较少字节数的更高效的协议缓冲区类型。

很抱歉描述过长,但我想详细解释一下我的查询。请帮帮我。提前感谢:)

ipv4

推荐答案地址应该正好需要4个字节。如果您不知何故得到了8,那么您做错了什么-您可能是祸不单行-编码它?你在这里不需要那个。同样,IPv6应为16个字节。

通常设置为高位的4个字节最有效地存储为-varint在这里将是开销,这是由于高位的缘故。16字节更微妙-我使用bytes(字段标题加长度),因为它更容易组成联合,并且如果字段编号较大,则避免了为多个多字节字段标题付费(长度前缀16将始终是单字节的)。

然后我将通过oneof创建这些元素的联合:

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

这篇关于存储IPv4或IPv6地址最有效的协议类型(在C++中)是什么?我的地址是Boost::ASIO::IP::Address_v4(或v6)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆