Почему нельзя создавать Float32Array со смещением, кратным размеру элемента? - PullRequest
10 голосов
/ 10 сентября 2011

Я хотел бы прочитать двоичный файл с несколькими 32-битными значениями с плавающей запятой при смещении байта 31.

К сожалению, new Float32Array(buffer, 31, 6); не работает. Смещение 32 вместо 31 работает, но мне нужно 31.

Согласно этой странице , смещение должно быть кратным размеру элемента, в данном случае 4.

Меня интересует причина такого поведения. Почему имеет значение, где начинается представление?

лучший обходной путь, который я нашел до сих пор еще не превратил его в геккона, поэтому я не могу его использовать.

Действительно ли мне нужно вырезать и скопировать байтовые значения в новый массив, чтобы получить мои значения с плавающей точкой?

Ответы [ 2 ]

9 голосов
/ 27 декабря 2011

Меня интересует причина такого поведения.Почему имеет значение, где начинается представление?

Некоторые архитектуры не разрешают доступ к невыровненным словам, и существуют ограничения производительности для таких архитектур, как x86 (хотя некоторые инструкции должны быть выровнены).

Действительно ли мне нужно вырезать и скопировать байтовые значения в новый массив, чтобы получить мои значения с плавающей запятой?

Да, как и в примере с Маркусом, вы должны создатьновый ArrayBuffer с представлением UInt8Array и представлением Float32Array для представления read_buffer (копирование с представлением UInt8Array и интерпретация из представления Float32Array).Затем вы можете прочитать данные с помощью UInt8Array, скопировать их в представление read_buffer и затем интерпретировать с помощью Float32Array.Это довольно плавный процесс.

4 голосов
/ 17 апреля 2013

DataView.getFloat32 () будет лучшим способом сделать это. DataView разработан для упакованных данных и позволяет осуществлять выравниваемый доступ к данным в ArrayBuffer, поэтому вы можете передавать с нечетными смещениями, такими как 31.

...