2016-06-02 11 views
1

Kann jemand erklären, wie ich einen Float (Vector3.x) in ein Byte-Array mit C# konvertieren und mit Knoten js dekodieren kann?Unity C# Konvertieren Float in Byte-Array und lesen mit Knoten js

Ich habe im Internet gelesen, dass Vector3.x ein System.Single Datentyp ist und 4 Bytes (32 Bits) verwenden. Ich benutze BitConverter, um es in ein Byte-Array zu konvertieren. Mit Nodejs benutze ich readFloatBE().

Ich weiß nicht, was ich falsch mache, aber ich bekomme ständig ein schlechtes Ergebnis mit Knoten js mit console.log().

Unity csharp:

 public static int FloatToBit(int offset, ref byte[] data, Single number) 
    { 
     byte[] byteArray = System.BitConverter.GetBytes(number); 
     for (int i = 0;i<4;i++) 
     { 
      data[offset + i] = byteArray[i]; 
     } 

     return 4; 
    } 

Knoten js

 readFloat: function (offset, data) { 
     var b = new Buffer(4); 
     for (var i = 0; i < 4; i++) {  
       b[i] = data[offset + i]; 
      }  
     return data.readFloatLE(b, 0); 
    }, 

Wenn ich -2,5 senden, Einheit ausgegeben: 0 0 32 191 mit -1 Einheit Ausgang: 0 0 128 192

NodeJS Ausgang mit readFloatLE: 3.60133705331478e-43

+0

Dokumentation zeigt - 'const buf = Buffer.from ([1,2,3,4,5,6,7,8]); buf.readDoubleBE(); // Rückgabe: 8.20788039913184e-304 buf.readDoubleLE(); // Rückgabe: 5.447603722011605e-270'. Aber ich weiß nicht warum. Ich bin neugierig. –

+0

Vorsicht mit 'neuem Puffer (Größe)'. Das ist [veraltet] (https://nodejs.org/api/buffer.html#buffer_new_buffer_size) mit der neuesten Version von node. Es könnte * technisch * in Ordnung sein, da Sie sowieso die 4 Bytes überschreiben, aber ich wollte es aufbringen. – dvlsg

+0

@MicahWilliamson Randnotiz: das sind nur die Zahlen vertreten. Was du machst, ist ein Puffer, der '0x0102030405060708' enthält, und die Doppelgänger, die du darstellst, sind das, was du in deinen Renditen siehst, abhängig davon, ob du sie als Big oder Little Endian liest. – dvlsg

Antwort

1

Hier ist ein Datum von vornem Arbeitssatz zu unterstützen.

C#:

Single fl = 2.5F; 
var bytes = System.BitConverter.GetBytes(fl); 
var str = BitConverter.ToString(bytes); // 00-00-20-40 

NodeJS:

let buffer = Buffer.from([ 0x00, 0x00, 0x20, 0x40 ]); 
let float = buffer.readFloatLE(); // 2.5 

Beachten Sie die Methode, die ich verwendet, um den Puffer in NodeJS zu schaffen, insbesondere (auch mit -1 getestet und überprüft, aber ich aufhörte, den Code der Kürze halber).

0

Danke für die Antworten.

Ich habe die gleiche Frage hier: Unity Questions

Jemand mir die Antwort geben zu verwenden:

readFloat: function (offset, data) { 
     return data.readFloatLE(offset); 

},

stattdessen einen neuen Puffer zu schaffen.

Parameter ist ein Puffer. Das hat für mich funktioniert. Ich verstehe immer noch nicht, warum mein Beispiel nicht funktioniert.