JavaScript中IEEE 754浮动的编码和解码

JavaScript中IEEE 754浮动的编码和解码,javascript,floating-point,node.js,ieee-754,Javascript,Floating Point,Node.js,Ieee 754,我需要对node.js中二进制文件的IEEE 754浮点和双精度进行编码和解码,以解析网络协议 是否有任何现有的库可以这样做,或者我必须阅读规范并自己实现它?或者我应该编写一个C模块来完成它吗?注意,从node 0.6开始,这个功能包含在核心库中,因此这是实现它的最佳新方法 有关详细信息,请参阅 如果你正在读/写二进制数据结构,你可能会考虑使用一个友好的包装器来围绕这个功能,以便于阅读和维护。插件如下:< P>我将C++(用GNU-GMP)转换器移植到Emscripten上,使其在浏览器中运行:

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


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

注意,从node 0.6开始,这个功能包含在核心库中,因此这是实现它的最佳新方法

有关详细信息,请参阅

如果你正在读/写二进制数据结构,你可能会考虑使用一个友好的包装器来围绕这个功能,以便于阅读和维护。插件如下:

< P>我将C++(用GNU-GMP)转换器移植到Emscripten上,使其在浏览器中运行:

Emscripten生成的JavaScript也将在Node.js上运行。不过,我不知道这是否是您想要的。在现代JavaScript(ECMAScript 2015)中,您可以使用
ArrayBuffer
Float32Array
/
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];
//0x40a00000是浮点/IEEE-754 32位中的“5”。
//您可以在此处查看:https://www.h-schmidt.net/FloatConverter/IEEE754.html
//MSB(最高有效字节)处于最高索引
常量字节=[0x00,0x00,0xa0,0x40];
//缓冲区就像是内存中的原始视图。
const buffer=new ArrayBuffer(bytes.length);
//UINT8阵列使用缓冲区作为其内存。
//这样我们可以逐字节存储数据
const byteArray=新的UINT8阵列(缓冲区);
for(设i=0;i它可以保存f32值
常量floatValue=floatArray[0];
//打印出“5”
log(`${JSON.stringify(bytes)},因为f32是${floatValue}`);
//双/f64
//constdoublearray=新的Float64Array(缓冲区);
//常数doubleValue=doubleArray[0];

注:这在NodeJS中有效,但在Chrome、Firefox和Edge中也有效。

也许你可以看看这件事是否符合你的要求:另请看:(这里的所有答案也适用)