javascript - 从 Javascript 中的 C float 组读取原始字节(转换为 JS 数组)

标签 javascript c node.js floating-point buffer

我正在通过网络传输字节。这些字节最初是一个 C float[] 数组。

node.js 服务正在接收字节,但我对从 Buffer 到正确的 float/double 数组的转换感到有点困惑。

一些在线资源提供了一些帮助,但这些数字并没有立即显示出来。大多数情况下,它们要么是很长的整数,要么是很长的 float 。

float 组的长度为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));

接收器(node.js):

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

最佳答案

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

首先,我必须知道传入的字节数据类型是什么。在本例中,它是一个 float 类型。

C float 类型为每个地址分配 4 个字节。由于我有一个 32 个 float 的数组(列表大小为 32),因此在 steam 中有 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 个原型(prototype)方法来读取 float :

  • readFloatBE()
  • readFloatLE()

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

关于javascript - 从 Javascript 中的 C float 组读取原始字节(转换为 JS 数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49132819/

相关文章:

javascript - 如何使用 lodash 克隆所有非未定义的属性?

javascript - 在 TinyMCE 中自动将两个破折号转换为 —

javascript - HTML5 Canvas - 如何 fill() 一个特定的上下文

javascript - 为什么这段代码 jquery 不起作用?

c - 通过字符串将大数相乘

javascript - 箭头函数 "expression expected"语法错误

javascript - 如何通过 ajax 将 javascript 对象发送到 php?

c - 将值附加到 c 数组

c - 如何解决 printf 中的 %d 输出显示 num1、num2 和 sum 的 ascii 值,而不是它们分配的值

javascript - Validators.pattern 未显示手机号码错误