Thanks Marc for your reply! By mistake I wrote 8-bytes for ipv4. I have
corrected it as 4-bytes in my question. Thanks for that :)
One thing I want to ask you is that can I use "oneof" if my field
"localEndpoint" is repeated?
I mean to say that my one "profile" message can have any among :
-> 2 ipv4 addresses
-> OR 2 ipv6 addresses
-> OR 1 ipv4 + 1 ipv6 addresses
in the field "localEndpoint".
So in that case, is "oneof" usage correct? I think that a "oneof" cannot be
repeated. Please correct me if I am wrong.
On Wednesday, July 18, 2018 at 12:54:39 PM UTC+5:30, Marc Gravell wrote:
>
> You should be able to encode ipv4 in 4 bytes, making fixed32 ideal, since
> you can avoid the length prefix. For ipv6, you're going to need 16 bytes,
> so "bytes" is probably your best bet, since it will only require a single
> header. You can then create a union of those:
>
> oneof ip_addr {
> fixed32 v4 = 1;
> bytes v6 = 2;
> }
>
> That seems pretty optimal to me.
>
> Marc
>
> On Wed, 18 Jul 2018, 08:16 sanjana gupta, <[email protected]
> <javascript:>> wrote:
>
>> I read that protobuf has a type called "*bytes*" which can store
>> arbitrary number of bytes and is the equivalent of "C++ string".
>>
>> The reason why I don't prefer to use "bytes" is that it expects input as
>> a C++ string i.e., boost IP will need to be converted to a string.
>>
>>
>> Now my concern lies here : I want to perform serialize and send the
>> encoded protobuf message over TCP socket. I want to ensure that the *encoded
>> message size is as small as possible*.
>>
>>
>> Currently, I am using the below .proto file :
>>
>> syntax = "proto2";
>>
>> message profile
>>
>> {
>>
>> repeated *uint32* localEndpoint = 1;
>>
>> repeated *uint32* remoteEndpoint = 2;
>>
>> }
>>
>>
>> In order to save boost IP in the protobuf message, I am first converting
>> boost IP into byte-format array by using
>> "boost::asio::ip::address_v4::to_bytes()". So for a v4 IP, resultant array
>> size is 8. Then I am converting 1st 4 bytes from the resultant byte-array
>> into one uint32_t number and then storing in "localEndpoint" field of the
>> protobuf message. Likewise, I repeat for the next 4 bytes. I am taking 4
>> bytes at a time so as to utilize full 32 bits of the uint32.
>>
>>
>> Hence for a v4 address, 2 occurrence of "localEndpoint" field is used.
>> Similarly, for a v6 address, 4 occurrence of "localEndpoint" field is used.
>>
>>
>> Please allow me to highlight that if I had used "bytes" here, my input
>> string itself would have been of size 15 bytes for a v4 ip like
>> 111.111.111.111
>>
>>
>> Using uint32 instead of "bytes" does save me some encoded-data-size but I
>> am looking for a more efficient protobuf type requiring lesser number of
>> bytes.
>>
>>
>> Sorry for a long description but I wanted to explain my query in details.
>> Please help me.. Thanks a lot in advance :)
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Protocol Buffers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected]
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/protobuf.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.