mte/src/b32.ml

35 lines
846 B
OCaml
Raw Normal View History

2025-09-30 16:39:08 +02:00
(* Crockford's variant of Base32
http://www.crockford.com/wrmg/base32.html
except that:
- 'U' is not excluded but also decodes to 'V'
- '-' is not allowed
- checksum is not allowed *)
2026-02-06 21:39:53 +01:00
(* 'I' 'L' 'O' 'U' excluded
no '=' padding in encoded string *)
2025-10-16 08:23:40 +02:00
type t = string
2025-09-30 16:39:08 +02:00
let alphabet = Base32.make_alphabet "0123456789ABCDEFGHJKMNPQRSTVWXYZ"
2026-02-06 21:39:53 +01:00
let encode s =
let s = Base32.encode_string ~alphabet s in
(* remove '=' padding *)
match String.index_opt s '=' with
| None -> s
| Some i -> String.sub s 0 i
2025-09-30 16:39:08 +02:00
let decode s =
let s =
String.map
(fun c ->
match Char.uppercase_ascii c with
| 'O' -> '0'
| 'I' | 'L' -> '1'
| 'U' -> 'V'
| c -> c)
s
in
2025-10-03 21:24:02 +02:00
match Base32.decode ~alphabet ~off:0 ~len:(String.length s) s with
| Error (`Msg e) -> Error e
| Ok v -> Ok v