nixp.ru v3.0

29 мая 2017,
понедельник,
01:20:58 MSK

DevOps с компанией «Флант»
Аватар пользователя myst
myst написал 17 марта 2010 года в 00:42 (904 просмотра) Ведет себя как Череп; открыл 50 тем в форуме, оставил 2987 комментариев на сайте.

Вряд ли тут кто-то знает, но всё же…

Очевидно, что самый простой и удобный способ прочитать бинарный файл — прочитать его в Buffer. Но, скажем, не эти данные нужны в виде массива, например, int. Я это делаю так

Array.init (Buffer.length b) (fun i -> int_of_char (Buffer.nth b i))

Есть ли более простой/красивый/естественный способ (что-нибудь вроде Buffer.to_array или Array.of_buffer, например)?

myst

Так-с, очевидно, что без создания массива и «цикла» для преобразования типов элементов не обойтись. Вопрос о скорости это снимает. А вопрос о простоте снимает отсутствие в Array и Buffer каких-либо намёков на преобразование одного в другое.

myst

Как вяснилось, Buffer не совсем удобен для одиночной загрузки. В таком случае следует или Bigarray.map_file’ить или делать так:

let read_data f =
  let ic = open_in_bin f in
  let n = in_channel_length ic in
  let s = String.create n in
  really_input ic s 0 n;
  close_in ic;
  Array.init n (fun i -> int_of_char s.[i])