我试图在任何其他语言中执行一些简单易懂的东西,但不是javascript:从浮动中获取位数(反之亦然).
在C/C++中它会是这样的
float a = 3.1415; int b = *((int*)&a);
反之亦然
int a = 1000; float b = *((float*)&a);
在C#中,您可以使用BitConverter ... floatBits或类似的东西......即使在VB6中为了基督的缘故,您也可以将float32存入int32.我怎么能在javascript中转换和int和浮点数?
在Javascript中将浮点数转换为二进制表示形式的最简单方法是什么?(例如1.0 - > 0x3F800000).
我试图手动完成,这在一定程度上(通常的数字)起作用,但是对于非常大或非常小的数字(没有范围检查)和特殊情况(NaN,无穷大等)都会失败:
function floatToNumber(flt)
{
var sign = (flt < 0) ? 1 : 0;
flt = Math.abs(flt);
var exponent = Math.floor(Math.log(flt) / Math.LN2);
var mantissa = flt / Math.pow(2, exponent);
return (sign << 31) | ((exponent + 127) << 23) | ((mantissa * Math.pow(2, 23)) & 0x7FFFFF);
}
Run Code Online (Sandbox Code Playgroud)
我重新发明轮子了吗?
编辑:我改进了我的版本,现在它处理特殊情况.
function assembleFloat(sign, exponent, mantissa)
{
return (sign << 31) | (exponent << 23) | (mantissa);
}
function floatToNumber(flt)
{
if (isNaN(flt)) // Special case: NaN
return …Run Code Online (Sandbox Code Playgroud) 我需要编码和解码IEEE 754浮点数并从node.js中的二进制文件加倍来解析网络协议.
是否有任何现有的库可以执行此操作,或者我是否必须阅读规范并自行实施?或者我应该写一个C模块来做吗?
好吧,所以我是一个相当讨厌的情况,我无法访问类型化的数组,如Float32Array,但仍然需要能够将Javascript数转换为字节.现在,我可以处理的整数很好,但我不知道如何为浮点值做.
我已经解决了相反的问题(将字节转换为浮点数),但是关于从float转换为字节的文档非常缺乏,因为大多数语言只是让您读取指针或具有处理它的公共类.
理想情况下,我希望能够将浮点数转换为4字节和8字节表示,并选择使用哪一个.但是,只需要一个数字并将其吐出为8字节的代码仍然很棒,因为我可能从那里自己想出32位版本.
我从这里找到了一个代码,它将 Javascript 数字转换为内部 IEEE 表示,作为两个 Uint32 值:
function DoubleToIEEE(f)
{
var buf = new ArrayBuffer(8);
(new Float64Array(buf))[0] = f;
return [ (new Uint32Array(buf))[0] ,(new Uint32Array(buf))[1] ];
}
Run Code Online (Sandbox Code Playgroud)
如何将返回值转换回 Javascript 数字?这边走:
var number = -10.3245535;
var ieee = DoubleToIEEE(number)
var number_again = IEEEtoDouble(ieee);
// number and number_again should be the same (if ever possible)
Run Code Online (Sandbox Code Playgroud) 我使用GO语言函数(math.Float32bits)序列化了32位浮点数,它返回对应于IEEE 754二进制表示的浮点数.然后将此数字序列化为32位整数,并将其作为字节数组读入java脚本.
例如,这是实际数字:
float: 2.8088086
as byte array: 40 33 c3 85
as hex: 0x4033c385
Run Code Online (Sandbox Code Playgroud)
有一个演示转换器显示相同的数字.
我需要从JavaScript中的字节数组中获取相同的浮点数,我不知道如何做到这一点.
我正在尝试将一些 Java 代码转换为我正在开发的应用程序所需的 JavaScript。我被困在一个类及其方法上,这些方法将 double 类型的变量转换为 long,然后将 long 转换为由表示该 long 数字的 8 个字节组成的字节数组。Java代码如下:
public static byte[] doubleToByteArray(double number)
{
// double to long representation
long longNum = Double.doubleToLongBits(number);
// long to 8 bytes
return new byte[] {(byte)((longNum >>> 56) & 0xFF),
(byte)((longNum >>> 48) & 0xFF),
(byte)((longNum >>> 40) & 0xFF),
(byte)((longNum >>> 32) & 0xFF),
(byte)((longNum >>> 24) & 0xFF),
(byte)((longNum >>> 16) & 0xFF),
(byte)((longNum >>> 8) & 0xFF),
(byte)((longNum >>> 0) & 0xFF)};
} // end doubleToByte(.) …Run Code Online (Sandbox Code Playgroud) 我知道在 python 中你可以创建一个表示数组打包字节的字符串,执行如下操作:
import numpy as np
np.array([1, 2], dtype=np.int32).tobytes()
# returns '\x01\x00\x00\x00\x02\x00\x00\x00'
np.array([1, 2], dtype=np.float32).tobytes()
# returns '\x00\x00\x80?\x00\x00\x00@'
Run Code Online (Sandbox Code Playgroud)
它们可以使用np.fromstring进行解码
目前,我的 Javascript 正在接收一串打包字节,该字符串对浮点数组(即'\x00\x00\x80?\x00\x00\x00@')进行编码,并且我需要解码该数组 - 执行此操作的最佳方法是什么?
(如果它是一个整数数组,我想我可以使用文本编码来提取字节,然后适当地相乘和相加......)
谢谢,