在JavaScript中将Uint8Array转换为Float64Array

时间:2018-12-12 01:11:49

标签: javascript typed-arrays

比方说,我有一个4096个项目的Uint8Array,其中每个项目的值均为0xff或255。我想将此数组转换为Float64Array,其中前一个数组的8个值对应于一个64位浮点数。 我已经尝试过此代码:

 // Every item is 1 byte in pixels array, I want 8 of them to represent
 // a 64-bit float in the float64Array
 let pixels = new Uint8Array([255, 255, 255 ... , 255]); // 4096 values
 let floatArr = new Float64Array(pixels.buffer); // Should be 512 values
 console.log(floatArr); // This shows NaNs all over.

我看到了另外两个问题,这些问题似乎与我要问的问题很接近,但我无法从提供给他们的答案中得到启发。 在检查Mozilla文档之后,对我来说这似乎是正确的使用方法,但是,我没有得到预期的结果。我怎样才能做到这一点?另外,我仅限于浏览器,可以使用最新版本。

编辑:样本运行的预期结果是:

// pixels array is the input
let pixels = new Uint8Array([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]); // 16x 0xff, 16 bytes
let floatArr = new Float64Array(pixels.buffer) // I expect this to be
// [0xffffffffffffffff, 0xffffffffffffffff] which is 8bytes x 2,
// Float64Array [ 18446744073709552000, 18446744073709552000 ]

1 个答案:

答案 0 :(得分:2)

例如https://en.wikipedia.org/wiki/NaN

  

IEEE 754 NaNs 用填充有1的指数字段表示   (例如无穷大),和一些非零数字   (以使其与无穷大值区分开);这种表示   允许定义多个不同的NaN值,具体取决于   哪些位设置为有效位,但也设置为   前导符号位(但不需要提供应用程序   NaN值的不同语义)。

因此,基本上,您已经创建了一个NaN数组。

要从uint8array缓冲区成功创建Float64Array,您需要确保该缓冲区包含有效的64位浮点数表示形式,例如

// pixels array is the input
let pixels = new Uint8Array([ 174,71,225,122,20,174,40,64]); // Float64Array([12.34]).buffer
let floatArr = new Float64Array(pixels.buffer) // I 
console.log(floatArr) // 12.34

尽管如此,您仍然可能不想使用Float64Array,因为彩色像素值的缓冲区转换不太可能创建任何有意义的数字。 (而且至少在类似C的情况下,您会冒着创建陷阱表示的风险,不确定在JS中如何处理)

有人在评论中建议使用BigUint64Array,它可以绕过NaN并捕获表示形式。但是我认为仍然只能在Chrome浏览器中使用。

正如Kaiido在下面指出的那样,一个Uint32Array将为每个像素保存4个颜色通道,因此,除非您试图在需要成对集成像素的地方做一些魔术,否则您想要一个32位类型的数组。