Base64 + BaseX codecs

Encode bytes with any alphabet.

`@splicemood/basex` provides RFC Base64 helpers and arbitrary base-N codecs for JavaScript, Python and Go. Pass alphabets from `@splicemood/alphabet`, including Unicode alphabets with more than 1000 symbols.

0runtime deps
3languages
20ksymbol alphabets tested
import { createBase } from "@splicemood/basex";
import ru from "@splicemood/alphabet/ru";

const basex = createBase(ru);
const token = basex.encode("любой алфавит");
console.log(basex.decode(token));

Any Base

Custom alphabets only need 2+ unique Unicode code points.

Strict Base64

Base64 decoding rejects malformed padding and non-canonical unused bits.

No Runtime Deps

Published JS, Python and Go packages contain source files only.

Install

Same API shape across runtimes.

npm install @splicemood/basex
pip install splicemood-basex
go get github.com/splicemood/basex

BaseX

Use alphabet package exports directly.

JavaScript

import { createBase } from "@splicemood/basex";
import ru from "@splicemood/alphabet/ru";

const codec = createBase(ru);
const encoded = codec.encode("SpliceMood");
console.log(codec.decode(encoded));

Python

from splicemood_alphabet.ru import alphabet as ru
from splicemood_basex import create_base

codec = create_base(ru)
encoded = codec.encode("SpliceMood")
print(codec.decode(encoded))

Go

codec, err := basex.NewEncoding(ru.Alphabet)
if err != nil {
	panic(err)
}
encoded := codec.EncodeString("SpliceMood")
decoded, err := codec.DecodeString(encoded)

Benchmarks

Evaluate the codec before installing.

Benchmarks are local and reproducible. Run them on the target CPU and runtime, then compare Base64, Base62 BaseX and large Unicode alphabets up to 20k symbols with 4096-byte payloads.

npm run bench

Runs JS, Python and Go benchmark suites for Base64 and BaseX.

Latest local benchmark results
Runtime Scenario Throughput Latency Memory
Node.js v20.19.6 Base64 encode 4 KiB 25,736 ops/s 38.9 µs/op n/a
Node.js v20.19.6 Base64 decode 4 KiB 8,868 ops/s 112.8 µs/op n/a
Node.js v20.19.6 Base62 encode 64 B 132,031 ops/s 7.57 µs/op n/a
Node.js v20.19.6 Base62 decode 64 B 476,190 ops/s 2.10 µs/op n/a
Node.js v20.19.6 Base62 encode 4 KiB 2,495 ops/s 400.9 µs/op n/a
Node.js v20.19.6 Base62 decode 4 KiB 9,066 ops/s 110.3 µs/op n/a
Node.js v20.19.6 Base1200 encode 4 KiB 4,890 ops/s 204.5 µs/op n/a
Node.js v20.19.6 Base1200 decode 4 KiB 6,962 ops/s 143.6 µs/op n/a
Node.js v20.19.6 Base20000 encode 4 KiB 7,569 ops/s 132.1 µs/op n/a
Node.js v20.19.6 Base20000 decode 4 KiB 8,236 ops/s 121.4 µs/op n/a
Python 3.12.10 Base64 encode 4 KiB 2,232 ops/s 448.0 µs/op n/a
Python 3.12.10 Base64 decode 4 KiB 1,253 ops/s 798.2 µs/op n/a
Python 3.12.10 Base62 encode 64 B 62,211 ops/s 16.1 µs/op n/a
Python 3.12.10 Base62 decode 64 B 61,936 ops/s 16.1 µs/op n/a
Python 3.12.10 Base62 encode 4 KiB 1,344 ops/s 744.2 µs/op n/a
Python 3.12.10 Base62 decode 4 KiB 1,015 ops/s 984.8 µs/op n/a
Python 3.12.10 Base1200 encode 4 KiB 1,371 ops/s 729.3 µs/op n/a
Python 3.12.10 Base1200 decode 4 KiB 1,008 ops/s 992.5 µs/op n/a
Python 3.12.10 Base20000 encode 4 KiB 1,005 ops/s 995.0 µs/op n/a
Python 3.12.10 Base20000 decode 4 KiB 1,097 ops/s 911.4 µs/op n/a
Go 1.26.2 Base64 encode 4 KiB 80,135 ops/s 12.5 µs/op 6,144 B/op · 1 alloc
Go 1.26.2 Base64 decode 4 KiB 22,699 ops/s 44.1 µs/op 28,672 B/op · 2 allocs
Go 1.26.2 Base62 encode 64 B 665,336 ops/s 1.50 µs/op 416 B/op · 1 alloc
Go 1.26.2 Base62 decode 64 B 1,233,502 ops/s 810.7 ns/op 1,120 B/op · 3 allocs
Go 1.26.2 Base62 encode 4 KiB 21,922 ops/s 45.6 µs/op 27,264 B/op · 1 alloc
Go 1.26.2 Base62 decode 4 KiB 21,864 ops/s 45.7 µs/op 77,824 B/op · 3 allocs
Go 1.26.2 Base1200 encode 4 KiB 36,484 ops/s 27.4 µs/op 14,336 B/op · 1 alloc
Go 1.26.2 Base1200 decode 4 KiB 17,895 ops/s 55.9 µs/op 85,888 B/op · 4 allocs
Go 1.26.2 Base20000 encode 4 KiB 41,142 ops/s 24.3 µs/op 12,288 B/op · 1 alloc
Go 1.26.2 Base20000 decode 4 KiB 16,918 ops/s 59.1 µs/op 21,760 B/op · 3 allocs

Snapshot hardware: Intel Core i3-12100F · Windows amd64 · Node.js v20.19.6 · Python 3.12.10 · Go 1.26.2

Scenario Dataset Covered by Expected behavior
Base64 strings UTF-8 vectors, Unicode text `encodeBase64` / `decodeBase64` tests RFC-compatible output
BaseX alphabets Russian alphabet, base 66 `createBase` / `NewEncoding` tests Lossless string and byte round trip
Large alphabets 1200 and 20000 symbols, 4096 bytes JS, Python and Go test suites Constant work per fixed block; no whole-buffer big integer conversion
Go benchmark Base62 + base1200 + base20000, 64 B and 4 KiB `npm run bench:go` Reports ns/op, B/op and allocs/op
JavaScript benchmark Base62 + base1200 + base20000, 64 B and 4 KiB `npm run bench:js` Reports ops/s per scenario
Python benchmark Base62 + base1200 + base20000, 64 B and 4 KiB `npm run bench:python` Reports ops/s per scenario