JavaScript - 以干净的方式将字节转换为float
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript - 以干净的方式将字节转换为float相关的知识,希望对你有一定的参考价值。
我最近发现我可以将Float32转换为代表它的字节数组 - 如下:
let number = Math.PI;
let bytes = new Uint8Array(new Float32Array([number]).buffer); // [219, 15, 73, 64]
有没有办法以干净的方式将bytes
转换回Float32?
有没有办法将字节转换回Float32
你不需要转换它,它已经存在!你只需要从float32视图中读取它。但是在您的示例中,您没有保存对float32视图的引用...
类型化数组的工作方式与javascript中的其他数字完全不同。关键是要独立考虑缓冲区和视图 - 也就是说,Float32Array和Uint8Array只是缓冲区的视图(缓冲区只是一个固定大小的连续内存块,这就是为什么类型化的数组如此之快)。
在您调用new Float32Array
的示例中,您传递了一个带有单个数字的数组来初始化它,但是您没有将它传递给缓冲区,这会导致它为您创建一个适当长度的缓冲区(4个字节)。当你调用new Uint8Array
时,你传递了一个缓冲区,这不会导致它只复制缓冲区,但实际上它直接使用它。下面的示例与您的示例相同,但保留所有引用并使上述断言更加明显:
const number = Math.PI
const buffer = new ArrayBuffer(4);
const f32 = new Float32Array(buffer); // [0]
const ui8 = new Uint8Array(buffer); // [0, 0, 0, 0]
f32[0] = number;
f32 // [3.1415927410125732]
ui8 // [219, 15, 73, 64]
ui8[3] = 1;
f32 // [3.6929245196445856e-38]
ui8 // [219, 15, 73, 1]
正如您所看到的,不需要在上面“转换”,因为两个视图共享相同的缓冲区,通过一个视图的任何更改都可以立即在另一个视图中获得。
这实际上是一种使用和理解浮点格式的好方法。还使用ui8[i].toString(2)
获取原始二进制文件,并使用ui8[i] = parseInt('01010101', 2)
为每个字节设置原始二进制,其中i为0-3。请注意,您不能通过f32视图设置原始二进制文件,因为它将以数字方式解释您的数字并将其分解为有效数字和指数,但是您可能希望这样做以查看数字二进制文件如何转换为float32格式。
以上是关于JavaScript - 以干净的方式将字节转换为float的主要内容,如果未能解决你的问题,请参考以下文章