JavaScript-以干净的方式将字节转换为浮点数

时间:2018-08-30 23:16:17

标签: javascript floating-point buffer converters

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

stop()

是否可以通过一种干净的方式将@Autowired private ConfigurableListableBeanFactory beanFactory; @Bean public List<MyBean> myBeansList() { List<MyBean> mylist; // Construct your list dynamically while(myCondition) { MyBean bean; // Manually register each instance with Spring beanFactory.registerSingleton("unique-name-for-this-bean",bean); } // Return your list as a bean so you can still autowire the list of beans // but each bean has already been manually added to the context return mylist; } 转换回Float32?

1 个答案:

答案 0 :(得分:2)

  

有没有一种方法可以将字节转换回Float32

您不需要转换它,它已经存在!您只需要从float32视图中读取它即可。但是在您的示例中,您没有保存对float32视图的引用...

类型化数组的工作方式与JavaScript中的其他数字非常不同。关键是要独立考虑缓冲区和视图-也就是说,Float32Array和Uint8Array只是缓冲区中的 views (缓冲区只是固定大小的连续内存块,这就是为什么类型化数组是这么快)。

在您的示例中,当您调用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格式。