Base32 Encoding / Decoding - 5-Bit Notations / Alphabets - Kai / Crockford / Electrologica

Encode / decode numbers in 5-bit groups (2^5=32) with Kai, Crockford or Electrologica notation / alphabet

KaiCrockfordElectrologica

Kai

The kai notation / alphabet (123456789abcdefghijkmnopqrstuvwx)

Note: Following base56 - the digit-0 and the letter-l are NOT used in the kai alphabet / notation.

Kai (Base32) Notation

Kai Binary Num Kai Binary Num Kai Binary Num Kai Binary Num
**1** 00000 0 **9** 01000 8 **h** 10000 16 **q** 11000 24
**2** 00001 1 **a** 01001 9 **i** 10001 17 **r** 11001 25
**3** 00010 2 **b** 01010 10 **j** 10010 18 **s** 11010 26
**4** 00011 3 **c** 01011 11 **k** 10011 19 **t** 11011 27
**5** 00100 4 **d** 01100 12 **m** 10100 20 **u** 11100 28
**6** 00101 5 **e** 01101 13 **n** 10101 21 **v** 11101 29
**7** 00110 6 **f** 01110 14 **o** 10110 22 **w** 11110 30
**8** 00111 7 **g** 01111 15 **p** 10111 23 **x** 11111 31

Note: The digit-0 and the letter-l are NOT used in kai.

Usage - Encode / Decode

require 'base32-alphabets'


binary = 0b0000000000000000010010100101001010010011000111001110010000001000010111000001010010111101110011100000000101001010000000110001100010000100011010100000110010000000100011000110000000101001010010100110001100010100101000110100101000010010100101011011100111001110  # binary
hex    = 0x00004a52931ce4085c14bdce014a0318846a0c808c60294a6314a34a1295b9ce   # hex

pp binary == hex
# => true

str    = "aaaa 7885 22f2 agff 1661 7755 e979 2441 6667 7664 a9aa cfff".gsub( ' ', '' )

str2 = Kai.encode( hex )   ## (binary) number to text
pp str
# => "aaaa788522f2agff16617755e979244166677664a9aacfff"
pp str2
# => "aaaa788522f2agff16617755e979244166677664a9aacfff"
pp str == str2
# => true
pp Kai.fmt( str2 )
# => "aaaa 7885 22f2 agff 1661 7755 e979 2441 6667 7664 a9aa cfff"
pp Kai.fmt( hex )   # all-in-one "shortcut" for Kai.fmt( Kai.encode( hex ))
# => "aaaa 7885 22f2 agff 1661 7755 e979 2441 6667 7664 a9aa cfff"

hex2 = Kai.decode( str2 )   ## text to (binary) number
pp hex
# => 512955438081049600613224346938352058409509756310147795204209859701881294
pp hex2
# => 512955438081049600613224346938352058409509756310147795204209859701881294
pp hex == hex2
# => true

pp = Kai.bytes( hex )
# => [9,9,9,9,6,7,7,4,1,1,14,1,9,15,14,14,0,5,5,0,6,6,4,4,13,8,6,8,1,3,3,0,5,5,5,6,6,5,5,3,9,8,9,9,11,14,14,14]
pp = Kai.bytes( str )  # or from a kai string (auto-decodes to hex first)
# => [9,9,9,9,6,7,7,4,1,1,14,1,9,15,14,14,0,5,5,0,6,6,4,4,13,8,6,8,1,3,3,0,5,5,5,6,6,5,5,3,9,8,9,9,11,14,14,14]

or

Base32.format = :kai

str = Base32.encode( hex )   ## (binary) number to text
pp str
# => "aaaa788522f2agff16617755e979244166677664a9aacfff"
pp Base32.fmt( str )
# => "aaaa 7885 22f2 agff 1661 7755 e979 2441 6667 7664 a9aa cfff"
pp Base32.fmt( hex )  # all-in-one "shortcut" for Base32.fmt( Base32.encode( hex ))
# => "aaaa 7885 22f2 agff 1661 7755 e979 2441 6667 7664 a9aa cfff"
pp = Base32.decode( str )   ## text to (binary) number
# => 512955438081049600613224346938352058409509756310147795204209859701881294
pp = Base32.bytes( hex )
# => [9,9,9,9,6,7,7,4,1,1,14,1,9,15,14,14,0,5,5,0,6,6,4,4,13,8,6,8,1,3,3,0,5,5,5,6,6,5,5,3,9,8,9,9,11,14,14,14]
pp = Base32.bytes( str )  # or from a kai string (auto-decodes to hex first)
# => [9,9,9,9,6,7,7,4,1,1,14,1,9,15,14,14,0,5,5,0,6,6,4,4,13,8,6,8,1,3,3,0,5,5,5,6,6,5,5,3,9,8,9,9,11,14,14,14]

Why Kai?

The Kai notation / alphabet is named in honor of Kai Turner who first deciphered the CryptoKitties 256-bit genes in 5-bit groups - thanks! See The CryptoKitties Genome Project: On Dominance, Inheritance and Mutation, January 2018.

Crockford

The crockford notation / alphabet (0123456789abcdefghjkmnpqrstvwxyz)

Note: The Crockford Base32 symbol set is a superset of the Base16 (hexadecimal) symbol set and starts counting at zero (0).

Crockford (Base32) Notation

Base32 Binary Num Base32 Binary Num Base32 Binary Num Base32 Binary Num
**0** 00000 0 **8** 01000 8 **g** 10000 16 **r** 11000 24
**1** 00001 1 **9** 01001 9 **h** 10001 17 **s** 11001 25
**2** 00010 2 **a** 01010 10 **j** 10010 18 **t** 11010 26
**3** 00011 3 **b** 01011 11 **k** 10011 19 **v** 11011 27
**4** 00100 4 **c** 01100 12 **m** 10100 20 **w** 11100 28
**5** 00101 5 **d** 01101 13 **n** 10101 21 **x** 11101 29
**6** 00110 6 **e** 01110 14 **p** 10110 22 **y** 11110 30
**7** 00111 7 **f** 01111 15 **q** 10111 23 **z** 11111 31

Note: 4 of the 26 letters are excluded: I L O U.

Usage - Encode / Decode

require 'base32-alphabets'


binary = 0b0000000000000000010010100101001010010011000111001110010000001000010111000001010010111101110011100000000101001010000000110001100010000100011010100000110010000000100011000110000000101001010010100110001100010100101000110100101000010010100101011011100111001110  # binary
hex    = 0x00004a52931ce4085c14bdce014a0318846a0c808c60294a6314a34a1295b9ce   # hex

pp binary == hex
# => true

str = "9999 6774 11e1 9fee 0550 6644 d868 1330 5556 6553 9899 beee".gsub( ' ', '' )

str2 = Crockford.encode( hex )   ## (binary) number to text
pp str2
# => "9999677411e19fee05506644d8681330555665539899beee"
pp str == str2
# => true
pp Crockford.fmt( str2 )
# => "9999 6774 11e1 9fee 0550 6644 d868 1330 5556 6553 9899 beee"

hex2 = Crockford.decode( str2 )   ## text to (binary) number
pp hex
# => 512955438081049600613224346938352058409509756310147795204209859701881294
pp hex2
# => 512955438081049600613224346938352058409509756310147795204209859701881294
pp hex == hex2
# => true

or

Base32.format = :crockford

str = Base32.encode( hex )   ## (binary) number to text
pp str
# => "9999677411e19fee05506644d8681330555665539899beee"
pp Base32.fmt( str )
# => "9999 6774 11e1 9fee 0550 6644 d868 1330 5556 6553 9899 beee"
pp = Base32.decode( str )   ## text to (binary) number
# => 512955438081049600613224346938352058409509756310147795204209859701881294

Electrologica

The electrologica notation / alphabet ( 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31)

Electrologica (Base32) Notation

Base32 Binary Num Base32 Binary Num Base32 Binary Num Base32 Binary Num
**00** 00000 0 **08** 01000 8 **16** 10000 16 **24** 11000 24
**01** 00001 1 **09** 01001 9 **17** 10001 17 **25** 11001 25
**02** 00010 2 **10** 01010 10 **18** 10010 18 **26** 11010 26
**03** 00011 3 **11** 01011 11 **19** 10011 19 **27** 11011 27
**04** 00100 4 **12** 01100 12 **20** 10100 20 **28** 11100 28
**05** 00101 5 **13** 01101 13 **21** 10101 21 **29** 11101 29
**06** 00110 6 **14** 01110 14 **22** 10110 22 **30** 11110 30
**07** 00111 7 **15** 01111 15 **23** 10111 23 **31** 11111 31

Usage - Encode / Decode

require 'base32-alphabets'


binary = 0b0000000000000000010010100101001010010011000111001110010000001000010111000001010010111101110011100000000101001010000000110001100010000100011010100000110010000000100011000110000000101001010010100110001100010100101000110100101000010010100101011011100111001110  # binary
hex    = 0x00004a52931ce4085c14bdce014a0318846a0c808c60294a6314a34a1295b9ce   # hex

pp binary == hex
# => true

str = "09-09-09-09 06-07-07-04 01-01-14-01 09-15-14-14 00-05-05-00 06-06-04-04 13-08-06-08 01-03-03-00 05-05-05-06 06-05-05-03 09-08-09-09 11-14-14-14".gsub( ' ', '-' )

str2 = Electrologica.encode( hex )   ## (binary) number to text
pp str2
# => "09-09-09-09-06-07-07-04-01-01-14-01-09-15-14-14-00-05-05-00-06-06-04-04-13-08-06-08-01-03-03-00-05-05-05-06-06-05-05-03-09-08-09-09-11-14-14-14"
pp str == str2
# => true
pp Electrologica.fmt( str2 )
# => "09-09-09-09 06-07-07-04 01-01-14-01 09-15-14-14 00-05-05-00 06-06-04-04 13-08-06-08 01-03-03-00 05-05-05-06 06-05-05-03 09-08-09-09 11-14-14-14"

hex2 = Electrologica.decode( str2 )   ## text to (binary) number
pp hex
# => 512955438081049600613224346938352058409509756310147795204209859701881294
pp hex2
# => 512955438081049600613224346938352058409509756310147795204209859701881294
pp hex == hex2
# => true

or

Base32.format = :electrologica

str = Base32.encode( hex )   ## (binary) number to text
pp str
# => "09-09-09-09-06-07-07-04-01-01-14-01-09-15-14-14-00-05-05-00-06-06-04-04-13-08-06-08-01-03-03-00-05-05-05-06-06-05-05-03-09-08-09-09-11-14-14-14"
pp Base32.fmt( str )
# => "09-09-09-09 06-07-07-04 01-01-14-01 09-15-14-14 00-05-05-00 06-06-04-04 13-08-06-08 01-03-03-00 05-05-05-06 06-05-05-03 09-08-09-09 11-14-14-14"
pp = Base32.decode( str )   ## text to (binary) number
# => 512955438081049600613224346938352058409509756310147795204209859701881294

Real World Usage

See the copycats command line tool (and core library) - crypto cats / kitties collectibles unchained - buy! sell! hodl! sire! - play for free - runs off the blockchain - no ether / gas required

More Documentation / Articles / Samples

License

The base32-alphabets scripts are dedicated to the public domain. Use it as you please with no restrictions whatsoever.