(* 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 *) (* 'I' 'L' 'O' 'U' excluded no '=' padding in encoded string *) type t = string let alphabet = Base32.make_alphabet "0123456789ABCDEFGHJKMNPQRSTVWXYZ" 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 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 (* restore padding for base32 lib *) let n = 8 - (String.length s mod 8) in let pad = String.make n '=' in let s = s ^ pad in match Base32.decode ~alphabet ~off:0 ~len:(String.length s) s with | Error (`Msg e) -> Error e | Ok v -> Ok v