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.

Reply via email to