123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291(**************************************************************************)(* *)(* OCaml *)(* *)(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)(* *)(* Copyright 1996 Institut National de Recherche en Informatique et *)(* en Automatique. *)(* *)(* All rights reserved. This file is distributed under the terms of *)(* the GNU Lesser General Public License version 2.1, with the *)(* special exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)(* this module is a temporary fix waiting for ocaml 4.08 *)(** {6 Binary encoding/decoding of integers} *)externalget_uint8:bytes->int->int="%bytes_safe_get"externalget_uint16_ne:bytes->int->int="%caml_bytes_get16"externalget_int32_ne:bytes->int->int32="%caml_bytes_get32"externalget_int64_ne:bytes->int->int64="%caml_bytes_get64"externalset_int8:bytes->int->int->unit="%bytes_safe_set"externalset_int16_ne:bytes->int->int->unit="%caml_bytes_set16"externalset_int32_ne:bytes->int->int32->unit="%caml_bytes_set32"externalset_int64_ne:bytes->int->int64->unit="%caml_bytes_set64"externalswap16:int->int="%bswap16"externalswap32:int32->int32="%bswap_int32"externalswap64:int64->int64="%bswap_int64"letget_int8bi=(get_uint8bilsl(Sys.int_size-8))asr(Sys.int_size-8)letget_uint16_lebi=ifSys.big_endianthenswap16(get_uint16_nebi)elseget_uint16_nebiletget_uint16_bebi=ifnotSys.big_endianthenswap16(get_uint16_nebi)elseget_uint16_nebiletget_int16_nebi=(get_uint16_nebilsl(Sys.int_size-16))asr(Sys.int_size-16)letget_int16_lebi=(get_uint16_lebilsl(Sys.int_size-16))asr(Sys.int_size-16)letget_int16_bebi=(get_uint16_bebilsl(Sys.int_size-16))asr(Sys.int_size-16)letget_int32_lebi=ifSys.big_endianthenswap32(get_int32_nebi)elseget_int32_nebiletget_int32_bebi=ifnotSys.big_endianthenswap32(get_int32_nebi)elseget_int32_nebiletget_int64_lebi=ifSys.big_endianthenswap64(get_int64_nebi)elseget_int64_nebiletget_int64_bebi=ifnotSys.big_endianthenswap64(get_int64_nebi)elseget_int64_nebiletset_int16_lebix=ifSys.big_endianthenset_int16_nebi(swap16x)elseset_int16_nebixletset_int16_bebix=ifnotSys.big_endianthenset_int16_nebi(swap16x)elseset_int16_nebixletset_int32_lebix=ifSys.big_endianthenset_int32_nebi(swap32x)elseset_int32_nebixletset_int32_bebix=ifnotSys.big_endianthenset_int32_nebi(swap32x)elseset_int32_nebixletset_int64_lebix=ifSys.big_endianthenset_int64_nebi(swap64x)elseset_int64_nebixletset_int64_bebix=ifnotSys.big_endianthenset_int64_nebi(swap64x)elseset_int64_nebixletset_uint8=set_int8letset_uint16_ne=set_int16_neletset_uint16_be=set_int16_beletset_uint16_le=set_int16_lemoduletypeS=sig(** {1 Binary encoding/decoding of integers} *)(** The functions in this section binary encode and decode integers to
and from byte sequences.
All following functions raise [Invalid_argument] if the space
needed at index [i] to decode or encode the integer is not
available.
Little-endian (resp. big-endian) encoding means that least
(resp. most) significant bytes are stored first. Big-endian is
also known as network byte order. Native-endian encoding is
either little-endian or big-endian depending on {!Sys.big_endian}.
32-bit and 64-bit integers are represented by the [int32] and
[int64] types, which can be interpreted either as signed or
unsigned numbers.
8-bit and 16-bit integers are represented by the [int] type,
which has more bits than the binary encoding. These extra bits
are handled as follows: {ul
{- Functions that decode signed (resp. unsigned) 8-bit or 16-bit
integers represented by [int] values sign-extend
(resp. zero-extend) their result.}
{- Functions that encode 8-bit or 16-bit integers represented by
[int] values truncate their input to their least significant
bytes.}}
*)(** [get_uint8 b i] is [b]'s unsigned 8-bit integer starting at byte index [i].
@since 4.08
*)valget_uint8:bytes->int->int(** [get_int8 b i] is [b]'s signed 8-bit integer starting at byte index [i].
@since 4.08
*)valget_int8:bytes->int->int(** [get_uint16_ne b i] is [b]'s native-endian unsigned 16-bit integer
starting at byte index [i].
@since 4.08
*)valget_uint16_ne:bytes->int->int(** [get_uint16_be b i] is [b]'s big-endian unsigned 16-bit integer
starting at byte index [i].
@since 4.08
*)valget_uint16_be:bytes->int->int(** [get_uint16_le b i] is [b]'s little-endian unsigned 16-bit integer
starting at byte index [i].
@since 4.08
*)valget_uint16_le:bytes->int->int(** [get_int16_ne b i] is [b]'s native-endian signed 16-bit integer
starting at byte index [i].
@since 4.08
*)valget_int16_ne:bytes->int->int(** [get_int16_be b i] is [b]'s big-endian signed 16-bit integer
starting at byte index [i].
@since 4.08
*)valget_int16_be:bytes->int->int(** [get_int16_le b i] is [b]'s little-endian signed 16-bit integer
starting at byte index [i].
@since 4.08
*)valget_int16_le:bytes->int->int(** [get_int32_ne b i] is [b]'s native-endian 32-bit integer
starting at byte index [i].
@since 4.08
*)valget_int32_ne:bytes->int->int32(** [get_int32_be b i] is [b]'s big-endian 32-bit integer
starting at byte index [i].
@since 4.08
*)valget_int32_be:bytes->int->int32(** [get_int32_le b i] is [b]'s little-endian 32-bit integer
starting at byte index [i].
@since 4.08
*)valget_int32_le:bytes->int->int32(** [get_int64_ne b i] is [b]'s native-endian 64-bit integer
starting at byte index [i].
@since 4.08
*)valget_int64_ne:bytes->int->int64(** [get_int64_be b i] is [b]'s big-endian 64-bit integer
starting at byte index [i].
@since 4.08
*)valget_int64_be:bytes->int->int64(** [get_int64_le b i] is [b]'s little-endian 64-bit integer
starting at byte index [i].
@since 4.08
*)valget_int64_le:bytes->int->int64(** [set_uint8 b i v] sets [b]'s unsigned 8-bit integer starting at byte index
[i] to [v].
@since 4.08
*)valset_uint8:bytes->int->int->unit(** [set_int8 b i v] sets [b]'s signed 8-bit integer starting at byte index
[i] to [v].
@since 4.08
*)valset_int8:bytes->int->int->unit(** [set_uint16_ne b i v] sets [b]'s native-endian unsigned 16-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_uint16_ne:bytes->int->int->unit(** [set_uint16_be b i v] sets [b]'s big-endian unsigned 16-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_uint16_be:bytes->int->int->unit(** [set_uint16_le b i v] sets [b]'s little-endian unsigned 16-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_uint16_le:bytes->int->int->unit(** [set_int16_ne b i v] sets [b]'s native-endian signed 16-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int16_ne:bytes->int->int->unit(** [set_int16_be b i v] sets [b]'s big-endian signed 16-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int16_be:bytes->int->int->unit(** [set_int16_le b i v] sets [b]'s little-endian signed 16-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int16_le:bytes->int->int->unit(** [set_int32_ne b i v] sets [b]'s native-endian 32-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int32_ne:bytes->int->int32->unit(** [set_int32_be b i v] sets [b]'s big-endian 32-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int32_be:bytes->int->int32->unit(** [set_int32_le b i v] sets [b]'s little-endian 32-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int32_le:bytes->int->int32->unit(** [set_int64_ne b i v] sets [b]'s native-endian 64-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int64_ne:bytes->int->int64->unit(** [set_int64_be b i v] sets [b]'s big-endian 64-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int64_be:bytes->int->int64->unit(** [set_int64_le b i v] sets [b]'s little-endian 64-bit integer
starting at byte index [i] to [v].
@since 4.08
*)valset_int64_le:bytes->int->int64->unitend