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 для преобразования из одного в другое?

К сожалению, кажется, что это дублирует и копирует полезную нагрузку данных, поэтому может быть лучше переосмыслить ваш общий подход. В вашем вопросе недостаточно информации, чтобы сделать более точное предложение.

Другие вопросы по тегам