假设我有一个由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 ]
发布于 2018-12-12 02:17:27
看一看例如https://en.wikipedia.org/wiki/NaN
IEEE754是用指数字段表示的,指数字段中填充了(如无穷大值)、和一些意义中的非零数和(使它们不同于无穷大值);这种表示允许定义多个不同的NaN值,这取决于在意义中设置了哪些位,但也取决于前导符号位的值(但应用程序不需要为这些不同的NaN值提供不同的语义)。
基本上,你已经创建了一系列的NaNs。
要成功地从Float64Array缓冲区创建uint8array,需要确保缓冲区包含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上使用。
正如凯伊多在下面指出的那样,一个Uint32Array将为每个像素保存你的4个彩色通道,所以除非你试图在你需要成对地集成像素的地方做一些魔术,32位类型的数组就是你想要的。
https://stackoverflow.com/questions/53734684
复制相似问题