2016-05-03 3 views
0

Я пытаюсь отправить поплавок по сети из программы, написанной на C# в окнах, в приложение для Android, написанное в java, с помощью плоских буферов.Почему FlatBufferBuilder.dataBuffer возвращает другой буфер, чем java.nio.ByteBuffer.wrap?

Из полученных байтов в приложении android буфер создается с помощью java.nio.ByteBuffer.wrap. Из этого буфера объект Example десериализуется. Это приводит к тому, что каждый поплавок устанавливается равным 0.

В приведенном ниже примере показано это поведение.

Почему «example2» возвращает значение 0.0 вместо 20.0?

Это схема я использую:

// Example IDL file for our monster's schema. 
namespace MyGame.Sample; 
table Example { 
    myFloat:float; 
} 
root_type Example; 

Это код Java, который показывает поведение:

//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()); 

Выход:

System.out: 1: Myfloat: 20.0 
System.out: 2: Myfloat: 0.0 
+0

Что предлагает источник для FlatBuffers? –

+0

В источнике Flatbuffers используется java.nio.Bytebuffer с минимальным порядком. Даже если я изменил буфер для example2 на маленький endian, он все равно имеет тот же результат. –

ответ

1

массив() получает сырье underlyimg buffer, который содержит FlatBuffer со смещением, возможно, отличным от 0. Вместо этого есть метод в FlatBufferBui lder (чье имя ускользает от меня прямо сейчас), которое доставит вам буфер.

+0

Спасибо, это было действительно смещение. –

Смежные вопросы