我有一个来自cryptoAudioData方法的float32Array,我想将其转换为Uint8Array,同时保留float32 IEEE 754音频数据。
到目前为止,我尝试过
var length = float32Array.length;
var emptyBuffer = new ArrayBuffer(length * 4);
var view = new DataView(emptyBuffer);
for (var i = 0; i < length; i++) {
view.setFloat32(i * 4, float32Array[i], true);
}
var outputArray = new Uint8Array(length);
for (var j = 0; j < length; j++) {
outputArray[j] = view.getUint8(j * 4);
}
return outputArray;
编辑:
我只需要保持二进制表示形式,就像在answer.中一样
最佳答案
您问的不是很清楚。或者,确切地说,您要问的是没有意义的事情。Float32Array
实例是“原始”字节值缓冲区(如所有类型数组)的视图。数组的每个元素代表这些原始字节中的4个。通过简单的数组查找提取值:
var n = float32array[1];
将这4个字节隐式解释为IEEE 32位浮点值,然后将该值转换为标准JavaScript编号。 JavaScript数字始终是64位IEEE浮点值。
类似地,
Uint8Array
是缓冲区的视图,每个元素给出一个字节的无符号整数值。那是,var n = uint8array[1];
访问该元素,将其解释为一个无符号的1字节整数,并将其转换为JavaScript数字。
因此:如果要检查32位浮点值的列表作为每个字节的原始整数值,则可以创建一个
Uint8Array
来“共享”与Float32Array
相同的缓冲区:var uintShared = new Uint8Array(float32array.buffer);
通过查看
Uint8Array
值看到的数字值似乎与通过查看Float32Array
元素获得的数字值没有任何关系,这是可以预期的。另一方面,如果要创建一个新的
Uint8Array
来保存Float32Array
中的表观值,则可以创建一个长度相同的新数组并复制每个值:var uintCopy = new Uint8Array(float32array.length);
for (let i = 0; i < float32array.length; ++i)
uintCopy[i] = float32array[i]; // deeply problematic; see below
现在,这通常不太好,因为
Float32Array
中的值的数字范围大大大于Uint8Array
中的值的数字范围。一方面,32位浮点值可以为负。而且,即使您知道浮点值都是0到255范围内的所有整数,您也肯定不会在Uint8Array
中获得相同的位模式,原因很简单,因为32位浮点数是只是与8位无符号整数不同。 “保留IEEE-754表示形式”没有任何意义。这就是实际情况。如果您要解释为什么认为自己想以某种方式将32位IEEE浮点数的所有32位都填充为8位无符号整数,则可以提供更直接有用的答案。
关于javascript - 在保留IEEE 754表示的同时将Float32Array转换为Uint8Array,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49348743/