Module Binary_packing
Packs and unpacks various types of integers into and from strings.
Functions ending in _int
should not be used in 32-bit programs because native OCaml ints will not be big enough.
pos
arguments refer to the location in the buf string.
We support big- and little-endian ints. Note that for an 8-bit (1-byte) integer, there is no difference, because endian-ness only changes the order of bytes, not bits.
val compare_endian : endian -> endian -> int
val hash_fold_endian : Base.Hash.state -> endian -> Base.Hash.state
val hash_endian : endian -> Base.Hash.hash_value
val sexp_of_endian : endian -> Ppx_sexp_conv_lib.Sexp.t
val endian_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> endian
val __endian_of_sexp__ : Ppx_sexp_conv_lib.Sexp.t -> endian
val unpack_signed_8 : buf:bytes -> pos:int -> int
val pack_signed_8 : buf:bytes -> pos:int -> int -> unit
val unpack_unsigned_8 : buf:bytes -> pos:int -> int
val pack_unsigned_8 : buf:bytes -> pos:int -> int -> unit
val unpack_signed_16 : byte_order:endian -> buf:bytes -> pos:int -> int
The functions ending with
_big_endian
or_little_endian
are faster than the ones with an explicitbyte_order
argument:Name | Run time | S. dev. | Warnings ---------------------------------- | -------- | ------- | -------- pack_signed_16_little_endian | 4 ns | 0 ns | unpack_signed_16_little_endian | 5 ns | 0 ns | pack_signed_32_int | 12 ns | 0 ns | unpack_signed_32_int | 12 ns | 0 ns | pack_signed_32_int_little_endian | 4 ns | 0 ns | unpack_signed_32_int_little_endian | 5 ns | 0 ns | M pack_signed_64_int | 21 ns | 0 ns | M unpack_signed_64_int | 21 ns | 0 ns | M pack_signed_64_little_endian | 8 ns | 0 ns | unpack_signed_64_little_endian | 9 ns | 0 ns | M
val pack_signed_16 : byte_order:endian -> buf:bytes -> pos:int -> int -> unit
val unpack_unsigned_16_big_endian : buf:bytes -> pos:int -> int
val unpack_unsigned_16_little_endian : buf:bytes -> pos:int -> int
val pack_unsigned_16_big_endian : buf:bytes -> pos:int -> int -> unit
val pack_unsigned_16_little_endian : buf:bytes -> pos:int -> int -> unit
val unpack_signed_16_big_endian : buf:bytes -> pos:int -> int
val unpack_signed_16_little_endian : buf:bytes -> pos:int -> int
val pack_signed_16_big_endian : buf:bytes -> pos:int -> int -> unit
val pack_signed_16_little_endian : buf:bytes -> pos:int -> int -> unit
val unpack_unsigned_16 : byte_order:endian -> buf:bytes -> pos:int -> int
val pack_unsigned_16 : byte_order:endian -> buf:bytes -> pos:int -> int -> unit
val unpack_signed_32 : byte_order:endian -> buf:bytes -> pos:int -> int32
val unpack_signed_32_int : byte_order:endian -> buf:bytes -> pos:int -> int
val pack_signed_32 : byte_order:endian -> buf:bytes -> pos:int -> Core_kernel.Int32.t -> unit
val pack_signed_32_int : byte_order:endian -> buf:bytes -> pos:int -> int -> unit
val unpack_unsigned_32_int_big_endian : buf:bytes -> pos:int -> int
val unpack_unsigned_32_int_little_endian : buf:bytes -> pos:int -> int
val pack_unsigned_32_int_big_endian : buf:bytes -> pos:int -> int -> unit
val pack_unsigned_32_int_little_endian : buf:bytes -> pos:int -> int -> unit
val unpack_signed_32_int_big_endian : buf:bytes -> pos:int -> int
val unpack_signed_32_int_little_endian : buf:bytes -> pos:int -> int
val pack_signed_32_int_big_endian : buf:bytes -> pos:int -> int -> unit
val pack_signed_32_int_little_endian : buf:bytes -> pos:int -> int -> unit
val unpack_unsigned_32_int : byte_order:endian -> buf:bytes -> pos:int -> int
val pack_unsigned_32_int : byte_order:endian -> buf:bytes -> pos:int -> int -> unit
val unpack_signed_64 : byte_order:endian -> buf:bytes -> pos:int -> int64
val unpack_signed_64_int : byte_order:endian -> buf:bytes -> pos:int -> int
val pack_signed_64 : byte_order:endian -> buf:bytes -> pos:int -> Core_kernel.Int64.t -> unit
val pack_signed_64_int : byte_order:endian -> buf:bytes -> pos:int -> int -> unit
val unpack_signed_64_int_little_endian : buf:bytes -> pos:int -> int
val pack_signed_64_int_little_endian : buf:bytes -> pos:int -> int -> unit
val unpack_signed_64_int_big_endian : buf:bytes -> pos:int -> int
val pack_signed_64_int_big_endian : buf:bytes -> pos:int -> int -> unit
val unpack_signed_64_big_endian : buf:bytes -> pos:int -> int64
val unpack_signed_64_little_endian : buf:bytes -> pos:int -> int64
val pack_signed_64_big_endian : buf:bytes -> pos:int -> int64 -> unit
val pack_signed_64_little_endian : buf:bytes -> pos:int -> int64 -> unit
val unpack_float : byte_order:endian -> buf:bytes -> pos:int -> float
As with integers, floats can be be packed big-endian or little-endian, depending on the order in which the bytes of the float are layed out. There is nothing interesting going on computationally from a floating-point perspective, just laying out eight bytes in one order or the other.
val pack_float : byte_order:endian -> buf:bytes -> pos:int -> float -> unit
val unpack_tail_padded_fixed_string : ?padding:char -> buf:Core_kernel.Bytes.t -> pos:int -> len:int -> unit -> string
Decode the fixed-length tail-padded string having length
len
frombuf
starting atpos
. Return a string containing only the non-padding characters. The default padding is '\x00'.
val pack_tail_padded_fixed_string : ?padding:char -> buf:Core_kernel.Bytes.t -> pos:int -> len:int -> string -> unit
Encode and pack the given string as a tail padded fixed length string having length
len
. Place it inbuf
starting at positionpos
. If the length of the string is less thenlen
pad it with the padding characters until its length is equal tolen
. If the string is longer thanlen
raiseInvalid_argument
. The default padding is '\x00'.
module Private : sig ... end