有人可以解释我如何使用c#将float(Vector3.x)转换为字节数组并使用节点js解码它吗?
我在网上看到Vector3.x是一个system.single数据类型,使用4个字节(32位)。我使用BitConverter将其转换为字节数组。使用Nodejs我使用readFloatBE()。
我不知道我做错了什么,但是我通过console.log()获得了节点js的不良结果。
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;
}
节点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);
},
如果我发送-2.5,则单位输出为:0 0 32 191,-1单位输出为:0 0 128 192
使用readFloatLE输出Nodejs:3.60133705331478e-43
答案 0 :(得分:1)
这是从前到后的一组工作数据。
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
请注意我用于在nodejs中创建缓冲区的方法,尤其是(也使用-1进行测试和验证,但为了简洁起见,我将代码保留了。)
答案 1 :(得分:0)
感谢您的回复。
我在这里提出了同样的问题:Unity Questions
有人给我答案:
readFloat: function (offset, data) {
return data.readFloatLE(offset);
},
而是创建一个新的缓冲区。
参数是一个缓冲区。这对我有用。我仍然不明白为什么我的例子不起作用。