C++11 存储ipv4或ipv6地址最有效的协议类型(C+;+;)是什么?我的地址是boost::asio::ip::address\u v4(或v6)

C++11 存储ipv4或ipv6地址最有效的协议类型(C+;+;)是什么?我的地址是boost::asio::ip::address\u v4(或v6),c++11,protocol-buffers,boost-asio,C++11,Protocol Buffers,Boost Asio,我读到protobuf有一个名为“bytes”的类型,它可以存储任意数量的字节,相当于“C++字符串”。我不喜欢使用“字节”的原因是它希望输入是C++字符串,即Boost IP需要转换为字符串。现在我关心的是:我想执行序列化并通过TCP套接字发送编码的protobuf消息。我希望确保编码的消息大小尽可能小 目前,我正在使用以下.proto文件: syntax = "proto2"; message profile { repeated **uint32** localEndpoint =

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

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

syntax = "proto2";

message profile

{

repeated **uint32** localEndpoint = 1;

repeated **uint32** remoteEndpoint = 2;

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

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

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

使用uint32代替“bytes”确实可以节省一些编码数据的大小,但我正在寻找一种更高效的protobuf类型,它需要更少的字节数


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

一个ipv4地址应该正好需要4个字节。如果你不知何故得了8分,那你是做错了什么事——你可能是在用十六进制编码吗?你在这里不需要这个。同样,ipv6应该是16字节

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

然后,我将通过
oneof
创建这些元素的并集:

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

谢谢你的回复!我错误地为ipv4写了8字节。在我的问题中,我已将其更正为4字节。谢谢:)我想问你的一件事是,如果我的字段“localEndpoint”重复,我可以使用“oneof”吗?我的意思是说,我的一条“配置文件”消息可以有以下任意一个:->2个ipv4地址->或2个ipv6地址->或1个ipv4+1个ipv6地址。在字段“localEndpoint”中。那么在这种情况下,“oneof”的用法正确吗?我认为“其中之一”不能重复。如果我错了,请纠正我。你好,Marc,我想让你知道我尝试使用fixed32和fixed64 protobuf类型,它帮助我在编码数据大小上节省了相当多的字节。我创建的能够存储一个或多个v4/v6 IP的Protobuf消息:
消息IpAddress{message IpAddressTypes{message V6Type{repeated fixed64 v6IpAddress=1[packed=true];}其中一个IPType{fixed32 v4Ip=1;V6Type v6Ip=2;}}重复的IpAddressTypes ipAddress=1;}
感谢您对fixed32/fixed64类型的建议,并突出显示“其中之一”。如果你发现我的protobuf消息有任何错误,请纠正我。@SanjanaGupta我根本不理解这个proto;v6地址是16字节,所以我不明白fixed64在做什么。如果您将正好2个long存储为一个repeated,我想知道为什么您不使用
字节
,或者正好2个long作为不同的字段;并且显式存储地址类型似乎是不必要的和冗余的(“其中之一”已经告诉您是哪个“其中之一”)。所以是的,我不明白,什么意思?尺寸?这取决于(如果所有内容都在同一子网中,例如)。打包/解包性能?这些是不同的目标。是的。我希望protobuf编码数据的大小尽可能小,这仍然取决于数据。Protobuf具有可变编码(32位整数为1-5字节)。但是使用一些领域知识可能会缩短时间(例如屏蔽网络掩码)