package core_kernel

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

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.

type endian = [
  1. | `Big_endian
  2. | `Little_endian
]
val compare_endian : endian -> endian -> Base.Int.t
val hash_fold_endian : Base.Hash.state -> endian -> Base.Hash.state
val hash_endian : endian -> Base.Hash.hash_value
val endian_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> endian
val __endian_of_sexp__ : Ppx_sexp_conv_lib.Sexp.t -> endian
val sexp_of_endian : endian -> Ppx_sexp_conv_lib.Sexp.t
val unpack_signed_8 : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_signed_8 : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_unsigned_8 : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_unsigned_8 : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_signed_16 : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t

The functions ending with _big_endian or _little_endian are faster than the ones with an explicit byte_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:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_unsigned_16_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val unpack_unsigned_16_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_unsigned_16_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val pack_unsigned_16_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_signed_16_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val unpack_signed_16_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_signed_16_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val pack_signed_16_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_unsigned_16 : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_unsigned_16 : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_signed_32 : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int32.t
val unpack_signed_32_int : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_signed_32 : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Int32.t -> Base.Unit.t
val pack_signed_32_int : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_unsigned_32_int_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val unpack_unsigned_32_int_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_unsigned_32_int_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val pack_unsigned_32_int_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_signed_32_int_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val unpack_signed_32_int_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_signed_32_int_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val pack_signed_32_int_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_unsigned_32_int : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_unsigned_32_int : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_signed_64 : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int64.t
val unpack_signed_64_int : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_signed_64 : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Int64.t -> Base.Unit.t
val pack_signed_64_int : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_signed_64_int_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_signed_64_int_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_signed_64_int_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t
val pack_signed_64_int_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int.t -> Base.Unit.t
val unpack_signed_64_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int64.t
val unpack_signed_64_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int64.t
val pack_signed_64_big_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int64.t -> Base.Unit.t
val pack_signed_64_little_endian : buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Int64.t -> Base.Unit.t
val unpack_float : byte_order:endian -> buf:Base.Bytes.t -> pos:Base.Int.t -> Base.Float.t

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:Base.Bytes.t -> pos:Base.Int.t -> Base.Float.t -> Base.Unit.t

The following functions operate on "fixed-length tail-padded strings", by which is meant a string possibly followed by some padding, such that the length of the string plus the length of the padding equals the fixed length.

val unpack_tail_padded_fixed_string : ?padding:Base.Char.t -> buf:Base.Bytes.t -> pos:Base.Int.t -> len:Base.Int.t -> Base.Unit.t -> Base.Bytes.t

Decode the fixed-length tail-padded string having length len from buf starting at pos. Return a string containing only the non-padding characters. The default padding is '\x00'.

val pack_tail_padded_fixed_string : ?padding:Base.Char.t -> buf:Base.Bytes.t -> pos:Base.Int.t -> len:Base.Int.t -> Base.Bytes.t -> Base.Unit.t

Encode and pack the given string as a tail padded fixed length string having length len. Place it in buf starting at position pos. If the length of the string is less then len pad it with the padding characters until its length is equal to len. If the string is longer than len raise Invalid_argument. The default padding is '\x00'.

val test : Base.Unit.t -> Base.Unit.t