


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда вы компилируете в javascript, манипулирование двоичными данными в strings чрезвычайно подвержено ошибкам!
Подоплека - сомнительный выбор js_of_ocaml:
Поскольку строки javascript закодированы в UTF16, тогда как строки OCaml (неявно) закодированы в UTF8, js_of_ocaml пытается перемещаться между ними 2. Поэтому, когда он встречает «символ» с кодом> 127, js_of_ocaml преобразует его, что является катастрофой, если на самом деле это необработанные двоичные данные!
Решение состоит в том, чтобы манипулировать bigstring вместо string.
Bigstrings - это (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
Bigarray.Array1.t в необработанном OCaml, но все больше и больше библиотек используют их псевдонимы.
В частности, это Typed_array.Bigstring.t в js_of_ocaml (где вы можете увидеть функции для преобразования из и в ArrayBuffer)
Если ваша функция волшебным образом работает со строкой, скомпилированной в javascript, в нескольких местах есть функция перевода между большими строками и строками.
Например, библиотека bigstring: 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
@JoachimBreitner, вы можете не столкнуться с проблемами, пока двоичные строки передаются только из JS в ML, тогда как ловушка преобразования будет в другом направлении.
Спасибо! Пока все вроде работает с
string, как-то…