首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript -以一种干净的方式将字节转换为浮点型

JavaScript -以一种干净的方式将字节转换为浮点型
EN

Stack Overflow用户
提问于 2018-08-31 07:16:17
回答 1查看 2.9K关注 0票数 2

我最近发现,我可以将Float32转换为表示它的字节数组--就像这样:

代码语言:javascript
复制
let number = Math.PI;
let bytes = new Uint8Array(new Float32Array([number]).buffer); // [219, 15, 73, 64]

有没有办法以一种干净的方式将bytes 转换回Float32?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-31 08:02:16

有没有办法把字节转换回Float32

你不需要转换它,它已经存在了!您只需要从float32视图中读取它。然而,在您的示例中,您没有保存对float32视图的引用……

类型化数组的工作方式与JavaScript中的其他数字非常不同。关键是独立地考虑缓冲区和视图-也就是说,Float32Array和Uint8Array仅仅是缓冲区的视图(缓冲区只是一个固定大小的连续内存块,这就是类型化数组如此之快的原因)。

在您的示例中,当您调用new Float32Array时,您向它传递了一个带有单个数字的数组来初始化它,但是您没有向它传递一个缓冲区,这会导致它为您创建一个适当长度(4字节)的缓冲区。当您调用new Uint8Array时,您向它传递了一个缓冲区,这不会导致它只是复制缓冲区,而是实际上直接使用它。下面的示例等同于您的示例,但保留了所有引用,并使上面的断言更加明显:

代码语言:javascript
复制
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)获取原始二进制文件,并对i为0-3的每个字节使用ui8[i] = parseInt('01010101', 2)设置原始二进制文件。请注意,您不能通过f32视图设置原始二进制文件,因为它将以数字形式解释您的数字并将其分解为有效位和指数,但是您可能希望这样做,以查看数值二进制文件是如何转换为float32格式的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52106570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档