Skip to content

Latest commit

 

History

History
284 lines (189 loc) · 10.7 KB

README.md

File metadata and controls

284 lines (189 loc) · 10.7 KB

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.

  • I Can be confused with 1
  • L Can be confused with 1
  • O Can be confused with 0
  • U Accidental obscenity

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.