Skip to content
/ basex Public

Fast base encoding / decoding of any given alphabet using bitcoin style leading zero compression

License

Notifications You must be signed in to change notification settings

lucasepe/basex

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

basex

Fast base encoding / decoding of any given alphabet using bitcoin style leading zero compression.

Credits to https://github.com/eknkc/basex (this repo is a modified fork).

WARNING: This module is NOT RFC3548 compliant, it cannot be used for base16 (hex), base32, or base64 encoding in a standards compliant manner.

Example

Base62

import (
	"fmt"

	"github.com/lucasepe/basex"
)

const (
	Base62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
)

func Example_encode() {
	msg := []byte("hello, world")
	enc, err := basex.NewEncoding(Base62)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%q\n", enc.Encode(msg))
	// Output:
	// "g1CDtPywO1kG1foi"
}

func Example_decode() {
	enc, err := basex.NewEncoding(Base62)
	if err != nil {
		panic(err)
	}
	decoded, err := enc.Decode("g1CDtPywO1kG1foi")
	if err != nil {
		panic(err)
	}
	fmt.Printf("%q", decoded)
	// Output:
	// "hello, world"
}

Alphabets

See below for a list of commonly recognized alphabets, and their respective base.

Base Alphabet
2 01
8 01234567
11 0123456789a
16 0123456789abcdef
32 0123456789ABCDEFGHJKMNPQRSTVWXYZ
32 ybndrfg8ejkmcpqxot1uwisza345h769 (z-base-32)
36 0123456789abcdefghijklmnopqrstuvwxyz
58 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
62 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
64 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
67 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~

How it works

It encodes octet arrays by doing long divisions on all significant digits in the array, creating a representation of that number in the new base. Then for every leading zero in the input (not significant as a number) it will encode as a single leader character. This is the first in the alphabet and will decode as 8 bits. The other characters depend upon the base. For example, a base58 alphabet packs roughly 5.858 bits per character.

This means the encoded string 000f (using a base16, 0-f alphabet) will actually decode to 4 bytes unlike a canonical hex encoding which uniformly packs 4 bits into each character.

While unusual, this does mean that no padding is required and it works for bases like 43.

LICENSE MIT

A direct derivation of the base58 implementation from bitcoin/bitcoin, generalized for variable length alphabets.

About

Fast base encoding / decoding of any given alphabet using bitcoin style leading zero compression

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages