在Javascript中从C float数组中读取Raw字节(转换为JS数组)

时间:2018-03-06 14:10:46

标签: javascript c node.js floating-point buffer

我正在通过网络传输字节。这些字节起源于C float[]数组。

node.js服务正在接收这些字节,但我对从Buffer到正确浮点数/双精度数组的转换感到有点困惑。

一些在线资源提供了一些帮助,但这些数字并没有恰当地提到。它们大多是长整数或长浮点。

浮点数组的长度为32。

更新

根据请求,这是node.js缓冲区到达时:

<Buffer 00 50 4f d7 06 70 77 bf ca 24 d7 bf 00 00 00 00 00 00 00 00 
00 00 00 00 0b d7 23 3c 00 00 00 00 a6 9b c4 3c a4 70 3d 3f 0a d7 23 3c 
00 00 00 00 00 00 ... >

这是buf.toString()

之后的缓冲区
PO�pw��$׿
                   �#<���<�p=?
�#<�@
ף<ff�?
�#=�A

输出应该如下所示:

output = [1.23, 4.56, -0.23, 0.02, 1.22, ...] <length=32>

更新#2

根据请求,这里是发送者/接收者的一些代码。

发件人(C申请):

float tmp[] = { var1, var2, var3, var4, ..., var32 }
byte * b = (byte *) &tmp;
Serial.write(b, 32 * sizeof(float));

Receiver(node.js):

// Using ByteLength parser @ 32 * 4 bytes length
parser.on('data', (data) => console.log(data))

1 个答案:

答案 0 :(得分:0)

答案相当简单但不平凡。

首先,我必须知道传入的字节数据类型是什么。在这种情况下,它是float类型。

C float类型为每个地址分配4个字节。由于我有一个32个浮点数(列表大小为32)的数组,因此在蒸汽中有4 * 32个字节的位置可供读取。我所要做的就是一次迭代缓冲区4个位置并读取接下来的4个字节。以下是我如何做到这一点的示例代码:

var tmp = [];
for(var i =0; i < buf.length/4; i++) {
    tmp.push(buf.readFloatBE(i*4));
}

所以tmp包含我的float数组。需要进行一些实验,Javascript Buffer对象有2个原型方法来读取浮点数:

  • readFloatBE()
  • readFloatLE()

BE和LE代表“Big Endian”和“Little Endian”。这表示数字的字节顺序,并且因编译器而异。在这种情况下,我不得不使用BE来使其正常工作。