Joa*_*ner 5 javascript string ocaml arraybuffer js-of-ocaml
我正在构建一个在Ocaml中实现并使用编译为JavaScript的JavaScript库js_of_ocaml.
我的一个Ocaml函数返回string带有二进制数据的函数.我怎么可以公开使用js_of_ocaml的ArrayBuffer?
小智 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.t在js_of_ocaml(在那里你可以看到转换和转换的功能ArrayBuffer)
如果你的函数在javascript中编译后在字符串上运行魔术,那么在几个地方的bigstrings和字符串之间就有翻译功能.例如,bigstring库:http://c-cube.github.io/ocaml-bigstring/但这些功能也可以在Lwt_bytes的LWT
您可以gen_js_api在https://discuss.ocaml.org/t/handling-binary-data-in-ocaml-上查看关于同一主题的其他问题(包括在javascript中操作OCaml字符串的方法,而不是完全触及它们).
和JavaScript的/ 1519