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
open Big_int;;
let bitcoin_alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";;
let big_base = big_int_of_int 58;;
let encode_check data =
let string_to_bigint data =
let rec btb data acc = match String.length data with
| 0 -> acc
| n ->
let c' = String.get data 0 |> Char.code in
let rest = String.sub data 1 (n - 1) in
btb rest @@ add_int_big_int c' (mult_int_big_int 0x100 acc)
in btb data zero_big_int
in
let rec encode x =
match eq_big_int x zero_big_int with
| true -> if (String.get data 0 |> Char.code) = 0x00 then "1" else ""
| false ->
let (q, index) = quomod_big_int x big_base in
let ch = String.make 1 bitcoin_alphabet.[int_of_big_int index] in
(encode q) ^ ch
in encode @@ string_to_bigint data
;;