package stdint

  1. Overview
  2. Docs

Source file bytes_conv.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
module type IntSig = sig
  type t
  val zero    : t
  val bits    : int
  val of_int  : int -> t
  val to_int  : t -> int
  val logand  : t -> t -> t
  val logor   : t -> t -> t
  val shift_left : t -> int -> t
  val shift_right_logical : t -> int -> t
end

module type S = sig
  type t
  val of_bytes_big_endian : Bytes.t -> int -> t
  val of_bytes_little_endian : Bytes.t -> int -> t
  val to_bytes_big_endian : t -> Bytes.t -> int -> unit
  val to_bytes_little_endian : t -> Bytes.t -> int -> unit
end

let int_of_pos buffer offset = Char.code (Bytes.get buffer offset)

module Make (I : IntSig) = struct
  type t = I.t

  let of_bytes_big_endian buffer offset =
    let rec loop buffer i n =
      if i = (I.bits / 8) then n
      else
        let b = I.of_int (int_of_pos buffer (offset + i)) in
        let n' = I.logor (I.shift_left n 8) b in
        loop buffer (i + 1) n'
    in
    loop buffer 0 I.zero

  let of_bytes_little_endian buffer offset =
    let rec loop buffer i n =
      if i = 0 then n
      else
        let b = I.of_int (int_of_pos buffer (offset + i - 1)) in
        let n' = I.logor (I.shift_left n 8) b in
        loop buffer (i - 1) n'
    in
    loop buffer (I.bits / 8) I.zero

  let to_bytes_big_endian v buffer offset =
    let rec loop buffer i n =
      if i = 0 then ()
      else
        let b = Char.unsafe_chr (I.to_int (I.logand (I.of_int 0xFF) n)) in
        let () = Bytes.set buffer (offset + i - 1) b in
        let n' = I.shift_right_logical n 8 in
        loop buffer (i - 1) n'
    in
    loop buffer (I.bits / 8) v

  let to_bytes_little_endian v buffer offset =
    let rec loop buffer i n =
      if i = (I.bits / 8) then ()
      else
        let b = Char.unsafe_chr (I.to_int (I.logand (I.of_int 0xFF) n)) in
        let () = Bytes.set buffer (offset + i) b in
        let n' = I.shift_right_logical n 8 in
        loop buffer (i + 1) n'
    in
    loop buffer 0 v
end

OCaml

Innovation. Community. Security.