[英]How to produce a `ArrayBuffer` from `bytes` using `js_of_ocaml`
我正在构建一个在Ocaml中实现的JavaScript库,并使用js_of_ocaml
编译为JavaScript。
我的一个Ocaml函数返回一个包含二进制数据的string
。 如何使用js_of_ocaml
作为ArrayBuffer
公开它?
当您编译为javascript时,在string
s中操作二进制数据非常容易出错!
根本原因是js_of_ocaml
可疑选择:因为javascript字符串是以UTF16编码而OCaml字符串是(隐式地)编码为UTF8, js_of_ocaml
尝试在2之间导航。因此,当它遇到代码> 127的“字符”时, js_of_ocaml
将它转换为灾难,如果它实际上是原始二进制数据!
解决方案是操纵bigstring
而不是string
s。 Bigstrings是原始OCaml中的(char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t
但是越来越多的库将它们别名化。 特别是,它们是Typed_array.Bigstring.t
中的js_of_ocaml
(在这里你可以看到从和转换到ArrayBuffer
函数)
如果你的函数在javascript中编译后在字符串上运行魔术,那么在几个地方的bigstrings和字符串之间就有翻译功能。 例如,bigstring库: http://c-cube.github.io/ocaml-bigstring/但这些功能也可以在Lwt_bytes
的LWT
您可以在https://discuss.ocaml.org/t/handling-binary-data-in-ocaml上查看关于同一主题的其他问题(包括在javascript中操作OCaml字符串的方法,而不是使用gen_js_api
完全触及它们) -and-的JavaScript / 1519
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.