android - Can't send integer value more than 127 from c++ to java via UDP protobuf -


i'm trying send int data via udp using protobuf. visual c++ java(android studio)

proto file:

message rbr {   required int32 rpm = 1;   required int32 gear = 2;   required int32 speed = 3; } 

c++ sending:

telemetry.set_rpm(1200); telemetry.set_speed(120); telemetry.set_gear(4);  telemetry.serializetostring(&serializedmessage);  memset(message, '\0', buflen); memcpy(message, serializedmessage.c_str(), serializedmessage.size());   //send message if (sendto(s, message, serializedmessage.size(), 0, (struct sockaddr *) &si_other, slen) == socket_error) {    printf("sendto() failed error code : %d", wsagetlasterror());    exit(exit_failure); } 

java(android) receive using square wire protobuff library:

socket = new datagramsocket(8888);  wire wire = new wire();  while (true) {     packet = new datagrampacket(buf, buf.length);     socket.receive(packet);      s = new string(packet.getdata(), 0, packet.getlength());      byte[] bytes = s.getbytes();     rbr newmsg = wire.parsefrom(bytes, rbr.class);      sgear = newmsg.gear.tostring();     srpm = string.valueof(newmsg.rpm);     sspeed = newmsg.speed.tostring();         tvrpm.post(new runnable() {         public void run() {             tvrpm.settext(srpm);             tvgear.settext(sgear);             tvspeed.settext(sspeed);         }     }); } 

the data received correctly if value below 127, when send 128 result 3104751. works fine when try receive in visual c++ too.

updated code use serilizetoarray

int size = telemetry.bytesize(); char* array = new char[size]; telemetry.serializetoarray(array, size);         memset(message, '\0', buflen);   memcpy(message, array, size); 

but how receive on java? try code not working.

packet = new datagrampacket(buf, buf.length); socket.receive(packet);                     byte[] bytes = packet.getdata(); rbr newmsg = wire.parsefrom(bytes, rbr.class); 

using string byte array holder , calling string.getbytes() bad practice leads broken code.

you using message.serializetostring on c++ side, should use com.google.protobuf.textformat.merge(charsequence,messagebuilder) on java side parse protobuf text-format.

better yet, instead of text-format use normal binary representation. generated message , builder classes provide serialization , deserialization methods work directly byte arrays (and streams in java), , sending , receiving byte array on udp (arguably) more natural converting string , converting string byte array , back.


Comments

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -