从 Javascript 中的 C 浮点数组读取原始字节(转换为 JS 数组)
Reading Raw bytes from a C float array in Javascript (conversion to JS array)
我正在通过网络传输字节。这些字节起源于 C float[]
数组。
node.js 服务正在接收字节,但我对从 Buffer 到正确 floats/doubles.
数组的转换有点困惑
一些在线资源提供了一些帮助,但数字并不正确。大多数情况下,它们要么是非常长的整数,要么是长浮点数。
浮点数组的长度是 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
根据要求,这里有一些 sender/receiver.
的代码
发件人(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))
答案很简单,但是 non-trivial。
首先,我必须知道传入的字节数据类型是什么。在这种情况下,它是 float
类型。
C float
类型为每个地址分配 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 包含我的 float 数组。需要进行一些实验,Javascript Buffer 对象有 2 个原型方法来读取浮点数:
- readFloatBE()
- readFloatLE()
BE 和 LE 分别代表 "Big Endian" 和 "Little Endian"。这表示数字字节的顺序,并且因编译器而异。在这种情况下,我不得不使用 BE 来让它工作。
我正在通过网络传输字节。这些字节起源于 C float[]
数组。
node.js 服务正在接收字节,但我对从 Buffer 到正确 floats/doubles.
数组的转换有点困惑一些在线资源提供了一些帮助,但数字并不正确。大多数情况下,它们要么是非常长的整数,要么是长浮点数。
浮点数组的长度是 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
根据要求,这里有一些 sender/receiver.
的代码发件人(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))
答案很简单,但是 non-trivial。
首先,我必须知道传入的字节数据类型是什么。在这种情况下,它是 float
类型。
C float
类型为每个地址分配 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 包含我的 float 数组。需要进行一些实验,Javascript Buffer 对象有 2 个原型方法来读取浮点数:
- readFloatBE()
- readFloatLE()
BE 和 LE 分别代表 "Big Endian" 和 "Little Endian"。这表示数字字节的顺序,并且因编译器而异。在这种情况下,我不得不使用 BE 来让它工作。