我有一个从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数组是否有任何专门的,有效的操作?
答案 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
完成)。