代码之家  ›  专栏  ›  技术社区  ›  sidewaiise

在Javascript中从C浮点数组读取原始字节(转换为JS数组)

  •  -1
  • sidewaiise  · 技术社区  · 6 年前

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

    节点正在接收字节。js服务,但我对从缓冲区到正确浮点/双精度数组的转换有点困惑。

    一些在线资源提供了一些帮助,但这些数字并不正确。大多数情况下,它们要么是很长的整数,要么是长的浮点。

    浮点数组的长度为32。

    使现代化

    根据请求,这是节点。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));
    

    接收方(node.js):

    // Using ByteLength parser @ 32 * 4 bytes length
    parser.on('data', (data) => console.log(data))
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   sidewaiise    6 年前

    答案相当简单,但并不琐碎。

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

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

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

    所以tmp包含我的浮点数组。需要进行一些实验,Javascript缓冲区对象有两种读取浮点的原型方法:

    • readFloatBE()
    • readFloatLE()

    BE和LE代表“Big-Endian”和“Little-Endian”。这表示字节对数字的顺序,并且因编译器而异。在这种情况下,我必须使用BE来让它工作。