LINUX.ORG.RU

Ocaml и бинарные данные


0

0

Необходимо, например, из бин. файла (открытого через open_in_bin) вычитать беззнаковое целое. Но проблема в том, что тип int - только знаковый и на 32-битной архитектуре вычитать из файла 0xFFFFFFFF и вывести его или обработать нельзя т.к. будет uint32 - 0x7FFFFFFF, а int32 - (-1). Так же и для бинарного представления float будет съедаться старший бит, что не допустимо. Еще бы, ф-ции для перегона в Little-endian, т.к. стандартные ф-ции чтения вычитывают в Big. Как это решается ? Есть ли стандартные средства ???

anonymous

Что мешает воспользоваться Nativeint или Int32 ?

Про float Вы ошибаетесь -- в мануале сказано, что "Caml's floating-point numbers follow the IEEE 754 standard, using double precision (64 bits) numbers."

Vadim_Z
()

Точнее, сам int имеет 31 или 63 бита. Int32/64 имеют соответственно 32 и 64 бита. nativeint имеет 32 или 64 бита, в зависимости от платформы.

Для ввода-вывода http://ocaml-lib.sourceforge.net/doc/IO.html

Все они signed, так что видимо придётся писать signed -> unsigned самому. LE <--> BE я тоже не нашёл.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

> Что мешает воспользоваться Nativeint или Int32 ?

То, что Int32 и nativeint получаются через int (.of_int). Вычитывая бин. данные из файла всеравно сначала получим int и обрежим старший бит. Попробуй вычитать 0xFFFFFFFF и вывести Printf.printf "0x%X" int.

> Про float Вы ошибаетесь

Это внутреннее представление в Ocaml'e. При переводе из hex представления float получается ерунда.

Все это для 32-битной платформы.

anonymous
()
Ответ на: комментарий от anonymous

> val bits_of_float : float -> int32

> Return the internal representation of the given float according to the IEEE 754 floating-point ``single format'' bit layout. Bit 31 of the result represents the sign of the float; bits 30 to 23 represent the (biased) exponent; bits 22 to 0 represent the mantissa.

> val float_of_bits : int32 -> float

> Return the floating-point number whose internal representation, according to the IEEE 754 floating-point ``single format'' bit layout, is the given int32.

При конверсии float <--> int32 всё сохраняется. int -- да, другое дело.

Для ввода/вывода int32 и пр. -- ocamllib или bitstring. Ссылки выше.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

> LE <--> BE я тоже не нашёл.

Вот в модуле IO есть:

module BigEndian: sig .. end
 Same as operations above, but use big-endian encoding

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.