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
Post a Comment