Source file b64u.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
let rec trim_leading_null s =
  if String.length s = 0 then
    s
  else if String.get s 0 = '\000' then
    trim_leading_null (String.sub s 1 (String.length s - 1))
  else
    s

(** byte reversing *)
let rev s =
  let slen = String.length s in
  String.init slen (fun idx -> String.get s (slen - succ idx))

let urlencode =
  Base64.encode_string ~pad:false ~alphabet:Base64.uri_safe_alphabet

let urldecode s =
  Base64.decode ~pad:false ~alphabet:Base64.uri_safe_alphabet s

let urlencodez z = urlencode (trim_leading_null (rev (Z.to_bits z)))

let urldecodez z64 =
  Result.map (fun bits -> Z.of_bits (rev bits)) (urldecode z64)