Конвертировать Uint8Array в Float64Array в JavaScript - PullRequest
0 голосов
/ 12 декабря 2018

Допустим, у меня есть Uint8Array из 4096 элементов, каждый из которых имеет значение 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 голосов
/ 12 декабря 2018

Взгляните, например, на https://en.wikipedia.org/wiki/NaN

IEEE 754 NaN * представлены полем экспоненты, заполненным единицами (например, значения бесконечности), и некоторыми не- нулевое число в значимом и (чтобы отличать их от значений бесконечности);это представление позволяет определять несколько различных значений NaN, в зависимости от того, какие биты установлены в значенииand, а также от значения бита начального знака (но приложения не обязаны предоставлять различную семантику для этих различных значений NaN).

Итак, вы создали массив NaN.

Чтобы успешно создать 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.

И, как указано ниже Kaiido, Uint32Array будет хранить ваши 4 цветовых канала для каждого пикселя, так что если вы не пытаетесь творить магию там, где вам нужноинтегрируйте пиксели попарно, 32-битный типизированный массив - это то, что вам нужно.

...