我正在构建一个在 Ocaml 中实现并使用js_of_ocaml
.
我的一个 Ocaml 函数返回一个string
二进制数据。我怎样才能使用js_of_ocaml
as来公开它ArrayBuffer
?
我正在构建一个在 Ocaml 中实现并使用js_of_ocaml
.
我的一个 Ocaml 函数返回一个string
二进制数据。我怎样才能使用js_of_ocaml
as来公开它ArrayBuffer
?
当你编译成 javascript 时,在string
s 中操作二进制数据是非常容易出错的!
根本原因是有问题的选择js_of_ocaml
:因为 javascript 字符串以 UTF16 编码,而 OCaml 字符串(隐式)以 UTF8 编码,js_of_ocaml
试图在 2 之间导航。因此,当它遇到代码大于 127 的“字符”时,js_of_ocaml
转换如果它实际上是原始二进制数据,那将是一场灾难!
解决方案是操纵bigstring
s 而不是string
s。Bigstrings(char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
Bigarray.Array1.t
在原始 OCaml 中,但越来越多的库为它们起别名。特别是,它们Typed_array.Bigstring.t
在js_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