Как создать ArrayBuffer из байтов, используя js_of_ocaml - PullRequest
0 голосов
/ 17 сентября 2018

Я создаю библиотеку JavaScript, которая реализована в Ocaml и скомпилирована в JavaScript с использованием js_of_ocaml.

Одна из моих функций Ocaml возвращает string с двоичными данными. Как я могу выставить это используя js_of_ocaml как ArrayBuffer?

1 Ответ

0 голосов
/ 30 октября 2018

Когда вы компилируете в javascript, манипулирование двоичными данными в string s чрезвычайно подвержено ошибкам!

Основной причиной является сомнительный выбор js_of_ocaml: Поскольку строки javascript кодируются в UTF16, тогда как строки OCaml (неявно) кодируются в UTF8, js_of_ocaml пытается перейти между 2. Поэтому, когда он встречает «символ», код которого> 127, js_of_ocaml преобразует его, что это катастрофа, если это, по сути, необработанные двоичные данные!

Решение состоит в том, чтобы манипулировать bigstring с вместо string с. В необработанном OCaml большие строки равны (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t, но все больше и больше библиотек их называют. В частности, они Typed_array.​Bigstring.t в js_of_ocaml (где вы можете увидеть функции для преобразования и в ArrayBuffer)

Если ваша функция работает по волшебству над строкой, скомпилированной в javascript, в нескольких местах есть функция перевода между большими строками и строками. Например, библиотека больших строк: http://c -cube.github.io / ocaml-bigstring / , но эти функции также доступны в Lwt_bytes из lwt

Вы можете увидеть другой вопрос на ту же тему (включая способы манипулирования строкой OCaml в javascript, даже не касаясь их при помощи gen_js_api), на https://discuss.ocaml.org/t/handling-binary-data-in-ocaml-and-javascript/1519

...