Ocaml Cstruct和Lwt_字节
据我所知,Lwt_字节似乎使用与Cstruct相同的类型(或者可能使用Cstruct本身),但出于某种原因,我无法使这两个字节一起工作:Ocaml Cstruct和Lwt_字节,ocaml,ocaml-lwt,Ocaml,Ocaml Lwt,据我所知,Lwt_字节似乎使用与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)
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_字节,而Cstruct.LE似乎没有字节。
感谢据我所知,的第二个参数的类型为
bytes
(一个可变的OCaml字符串),而a是一个由8位整数组成的大数组。
虽然底层的“有效负载”是相同的(无符号字符的字对齐数组;请参见宏),但OCaml级别的“值包装器”是不同的(例如,请参见)
您是否尝试使用从一个转换到另一个
不幸的是,这是错误的,因此最好重新思考您的总体方法。你的问题中没有足够的信息来提出更精确的建议。这个答案是正确的。更详细地说,
Lwt_bytes.t
s是与Cstruct兼容的大数组,但是bytes
是核心OCaml类型,即可变字符串的类型。命名很混乱,因此很容易认为字节=Lwt\u字节.t
。原因是Lwt_bytes
早在bytes
作为一种新类型添加到核心语言之前就被命名了Lwt_io
构建在字节上,即常规(可变)OCaml字符串。要对Lwt\u bytes.t
进行I/O,必须使用模块Lwt\u bytes
(或其他bigarray库)中的函数。我还想指出,使用string
s或bytes
(如Lwt\u io
)的异步I/O几乎总是比使用BigString的I/O效率更低(与Cstruct类似,Lwt_bytes
)。这是因为string
和bytes
存储由垃圾收集器管理,并且可以移动,因此Lwt(或任何其他I/O库)必须进行内部复制,因此数据的地址在I/O期间保持不变。Bigstrings(Lwt_bytes.t
,Cstruct)固有地分配有固定存储,因此I/O不需要复制。Lwt\u字节
API(当前)不需要复制然而,正如Lwt_io
一样丰富。我明白,我确实没有意识到Lwt_字节。t和bytes不一样。现在这更有意义了,使用bytes确实很好。因为我使用Lwt_io,我只是用bytes替换了cstruct