Как создать ArrayBuffer из байтов с помощью js_of_ocaml

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
194
1

Ответы 1

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

Спасибо! Пока все вроде работает с string, как-то…

Joachim Breitner 30.10.2018 19:04

@JoachimBreitner, вы можете не столкнуться с проблемами, пока двоичные строки передаются только из JS в ML, тогда как ловушка преобразования будет в другом направлении.

Andreas Rossberg 31.10.2018 08:31

Другие вопросы по теме