将OCaml Bigarray.Array1的一部分复制到Bytes

时间:2018-12-11 14:12:32

标签: ocaml

我有一个从Bigarray.Array1元素和C布局的文件中映射的OCaml char。我正在尝试将其切片提取到Bytes.t中。例如,将字符3到字符10的数组内容放入长度为7的byte变量中。

有没有比遍历索引和使用Bytes.set更好的方法了?

例如

(* this feels inefficient *)
let slice array a b =
   let bytes = Bytes.create (b - a) in    
   for i = a to b-1 do
      Bytes.set bytes i (Bigarray.Array1.get array i)
   done ; bytes

我知道Bigarray.Array1.sub,但并不能真正拉近我。问题是数组类型的操作是多态的...对char数组是否有任何专门的,有效的操作?

1 个答案:

答案 0 :(得分:1)

如果您需要Bytes.t,则无论如何我都必须复制这些值。 您可以获得的最佳选择可能是:

let slice array a b =
  let sub = Bigarray.Array1.sub array a (b-a) in
  Bytes.init  (b - a)  (fun i -> Bigarray.Array1.unsafe_get sub i)

Bytes.init使用unsafe_set,而Bigarray.Array1.unsafe_get是读取数据的最快方法(并且边界检查已由sub完成)。