I would like to understand from the protobuf generated API point of view:

If I have,
repeated bytes localEndpoint = 1;

The generated file profile.pb.h shows me the following APIs to add+set 
values in it :

  // repeated bytes localEndpoint = 1;
*  inline void add_localendpoint(const ::std::string& value);*
*  inline void add_localendpoint(const char* value);*
*  inline void add_localendpoint(const void* value, size_t size);*

If I use any of them, perhaps my boost::asio::ip::address_v4 
(111.111.111.111) needs to be converted to a std::string and then only I 
can use add_localendpoint() to set a value.
Am I correct?

If the conversion to string is done, isn't the size of protobuf message 
going to be more compared to the case of using 
repeated uint32 localEndpoint = 1;
?

Please let me know if I have confused you :) Thanks again!

On Wednesday, July 18, 2018 at 3:08:52 PM UTC+5:30, Marc Gravell wrote:
>
> I would be amazed if there isn't a way of getting the raw underlying bytes 
> from the IP address, rather than the text (ASCII). The address 
> 111.111.111.111 is literally the 4 bytes with decimal values 111, 111, 111 
> and 111. No ASCII required.
>
> On Wed, 18 Jul 2018, 10:28 sanjana gupta, <[email protected] 
> <javascript:>> wrote:
>
>> Hey Marc,
>>
>> I am sorry if I am repeating my words. Please enlighten me on this thing :
>>
>> "bytes" requires me to give a std::string (c++) value as input. The 
>> problem with string for me is that a usual 4-byte ipv4 address like 
>> 111.111.111.111 becomes 15-bytes string "111.111.111.111"
>>
>> Having said that, I feel discouraged to use bytes over uint32 (or int 
>> type for that matter) as it already increases the *size of the data to 
>> be encoded*. As a result, we can say that :
>> size of (encoded message using "bytes" type)  >  size of (encoded message 
>> using "int" type)
>>
>> Is my understanding correct? Thanks!
>>
>>
>> On Wednesday, July 18, 2018 at 2:40:01 PM UTC+5:30, Marc Gravell wrote:
>>>
>>> At that point I'd probably use "repeated bytes", then. It'll cost you an 
>>> extra byte on v4 addresses, but it is simple. 
>>>
>>> On Wed, 18 Jul 2018, 09:36 sanjana gupta, <[email protected]> wrote:
>>>
>>>> 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]> 
>>>>> 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].
>>>>>> 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.
>>>>>>
>>>>> -- 
>>>> 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.
>>>>
>>> -- 
>> 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