Cstruct и Lwt_bytes
Насколько я могу судить, 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 вместо Lwt_bytes для удобства Cstruct.LE, которого, похоже, нет в байтах. Спасибо
1 ответ
Из того, что я могу сказать, второй аргумент Lwt_io.write_from_exactly имеет тип bytes
(изменяемая строка OCaml), тогда как Cstruct.buffer является Bigarray из 8-битных целых чисел. Хотя базовые "полезные нагрузки" одинаковы (выровненные по словам массивы беззнаковых символов; см. Макрос Bytes_val), "оболочки значений" на уровне OCaml различны (см., Например, caml_ba_alloc).
Вы пытались использовать Lwt_bytes.to_bytes для преобразования из одного в другое?
К сожалению, кажется, что это дублирует и копирует полезную нагрузку данных, поэтому может быть лучше переосмыслить ваш общий подход. В вашем вопросе недостаточно информации, чтобы сделать более точное предложение.