Ich versuche, ein Float über das Netzwerk von einem Programm in C# auf Windows geschrieben zu einer Android-Anwendung geschrieben in Java mit Flatbuffers zu senden.Warum gibt FlatBufferBuilder.dataBuffer einen anderen Puffer zurück als java.nio.ByteBuffer.wrap?
Aus den empfangenen Bytes in der Android-Anwendung wird ein Puffer mit java.nio.ByteBuffer.wrap erstellt. Aus diesem Puffer wird das Beispielobjekt deserialisiert. Dies führt jedoch dazu, dass jeder Float auf 0 gesetzt wird.
Im folgenden Beispiel wird dieses Verhalten gezeigt.
Warum gibt "example2" den Wert 0.0
anstelle von 20.0
zurück?
Dies ist das Schema i verwenden:
// Example IDL file for our monster's schema.
namespace MyGame.Sample;
table Example {
myFloat:float;
}
root_type Example;
Dies ist der Java-Code, die das Verhalten zeigen:
//The float
float myFloat = 20.0f;
FlatBufferBuilder builder = new FlatBufferBuilder(0);
//Build the example
Example.startExample(builder);
Example.addMyFloat(builder, myFloat);
int exampleInt = Example.endExample(builder);
builder.finish(exampleInt);
java.nio.ByteBuffer buf = builder.dataBuffer();
Example example = Example.getRootAsExample(buf);
System.out.println("1: Myfloat: " + example.myFloat());
byte[] bytesBuf = buf.array();
Example example2 = Example.getRootAsExample(java.nio.ByteBuffer.wrap(bytesBuf));
System.out.println("2: Myfloat: " + example2.myFloat());
Ausgang:
System.out: 1: Myfloat: 20.0
System.out: 2: Myfloat: 0.0
Was schlägt die Quelle für FlatBuffers vor? –
In der Quelle von Flatbuffers verwendet es einen java.nio.Bytebuffer mit kleiner Endian-Reihenfolge. Selbst wenn ich den Puffer für example2 in little endian ändere, hat er immer noch das gleiche Ergebnis. –