我有一个来自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/

10-09 17:27