8

我需要对 node.js 中的二进制文件中的 IEEE 754 浮点数和双精度数进行编码和解码,以解析网络协议。

是否有任何现有的库可以做到这一点,还是我必须阅读规范并自己实现它?或者我应该编写一个 C 模块来做到这一点?

4

3 回答 3

3

请注意,从节点 0.6 开始,此功能已包含在核心库中,因此这是实现此功能的最佳新方法。

有关详细信息,请参阅http://nodejs.org/docs/latest/api/buffer.html

如果你正在读/写二进制数据结构,你可能会考虑使用一个友好的包装器来围绕这个功能使事情更容易阅读和维护。插件如下:https ://github.com/dobesv/node-binstruct

于 2011-12-20T02:57:55.073 回答
1

我将支持 float128 的 C++(使用 GNU GMP)转换器移植到 Emscripten,以便它可以在浏览器中运行:https ://github.com/ysangkok/ieee-754

Emscripten 生成的 JavaScript 也将在 Node.js 上运行。但是,您将得到浮点表示作为一串位,但我不知道这是否是您想要的。

于 2012-12-10T14:41:19.800 回答
1

在现代 JavaScript (ECMAScript 2015) 中,您可以使用ArrayBufferFloat32Array/ Float64Array。我是这样解决的:

// 0x40a00000 is "5" in float/IEEE-754 32bit.
// You can check this here: https://www.h-schmidt.net/FloatConverter/IEEE754.html
// MSB (Most significant byte) is at highest index
const bytes = [0x00, 0x00, 0xa0, 0x40];
// The buffer is like a raw view into memory.
const buffer = new ArrayBuffer(bytes.length);
// The Uint8Array uses the buffer as its memory.
// This way we can store data byte by byte
const byteArray = new Uint8Array(buffer);
for (let i = 0; i < bytes.length; i++) {
  byteArray[i] = bytes[i];
}

// float array uses the same buffer as memory location
const floatArray = new Float32Array(buffer);

// floatValue is a "number", because a number in javascript is a
// double (IEEE-754 @ 64bit) => it can hold f32 values
const floatValue = floatArray[0];

// prints out "5"
console.log(`${JSON.stringify(bytes)} as f32 is ${floatValue}`);

// double / f64
// const doubleArray = new Float64Array(buffer);
// const doubleValue = doubleArray[0];

PS:这适用于 NodeJS,但也适用于 Chrome、Firefox 和 Edge。

于 2020-12-31T12:24:09.507 回答