Когда вы компилируете в 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