5

我正在构建一个在 Ocaml 中实现并使用js_of_ocaml.

我的一个 Ocaml 函数返回一个string二进制数据。我怎样才能使用js_of_ocamlas来公开它ArrayBuffer

4

1 回答 1

7

当你编译成 javascript 时,在strings 中操作二进制数据是非常容易出错的!

根本原因是有问题的选择js_of_ocaml:因为 javascript 字符串以 UTF16 编码,而 OCaml 字符串(隐式)以 UTF8 编码,js_of_ocaml试图在 2 之间导航。因此,当它遇到代码大于 127 的“字符”时,js_of_ocaml转换如果它实际上是原始二进制数据,那将是一场灾难!

解决方案是操纵bigstrings 而不是strings。Bigstrings(char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t在原始 OCaml 中,但越来越多的库为它们起别名。特别是,它们Typed_array.​Bigstring.tjs_of_ocaml(您可以在其中看到要转换的函数ArrayBuffer

如果您的函数一旦在 javascript 中编译就可以通过魔法对字符串起作用,那么在几个地方的大字符串和字符串之间都有翻译功能。例如 bigstring 库:httpLwt_bytes ://c-cube.github.io/ocaml-bigstring/ 但这些函数在lwt中也可用

您可以在https://discuss.ocaml.org/t/handling-binary-data-in-ocaml-上看到关于同一主题的其他问题(包括在 javascript 中操作 OCaml 字符串的方法,同时根本不使用它们gen_js_api和-javascript/1519

于 2018-10-30T15:47:15.270 回答