3

据我所知,Lwt_bytes 似乎使用与 Cstruct 相同的类型(或者可能使用 cstruct 本身),但出于某种原因,我不能让它们两者一起工作:

Lwt_io.write_from_exactly out b.Cstruct.buffer 0 16


Error: This expression has type
         Cstruct.buffer =
           (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
           Bigarray.Array1.t
       but an expression was expected of type bytes

字节不是完全相同的类型吗?我怎样才能做到这一点?为了方便 Cstruct.LE,我尝试使用 Cstruct 而不是 Lwt_bytes,这些字节似乎没有。谢谢

4

1 回答 1

3

据我所知,Lwt_io.write_from_exactly的第二个参数是类型bytes(可变 OCaml 字符串),而Cstruct.buffer是 8 位整数的 Bigarray。虽然底层的“有效负载”是相同的(无符号字符的字对齐数组;请参阅Bytes_val宏),但 OCaml 级别的“值包装器”是不同的(例如,请参阅caml_ba_alloc)。

您是否尝试过使用Lwt_bytes.to_bytes从一种转换为另一种?

不幸的是,这似乎复制了数据有效负载,因此重新考虑您的整体方法可能会更好。您的问题中没有足够的信息来提出更准确的建议。

于 2018-10-14T15:39:25.763 回答