jsZ85 provides an implementation of the Z85 codec following the specs of https://rfc.zeromq.org/spec/32/. It is a port of the https://github.com/ruben-viscomi/ktZ85 implementation for Kotlin.
npm install jsz85typescript
function getBytes(str: string): Uint8Array {
return new TextEncoder().encode(str);
}
const toEncode = "Hello, World!";
// ENCODING EXAMPLE
const encoded = Z85.encode(getBytes(toEncode));
console.log(encoded); // Outputs: nm=QNz.92jz/PV8aP
// DECODING EXAMPLE
const decoded = Z85.decode(encoded);
console.log(String.fromCharCode(...decoded)); // Outputs: Hello, World!
`
Benchmarks
Following the results on my machine of the benchmarks found in the bench folder.
$3
`bash
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ (index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '39b' │ '43.480µs' │ '13.560µs' │ '217.400µs' │ '67.800µs' │
│ 1 │ 'Z85' │ 5 │ '39b' │ '35.640µs' │ '44.540µs' │ '178.200µs' │ '222.700µs' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ (index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '1.00KB' │ '3.960µs' │ '5.700µs' │ '19.800µs' │ '28.500µs' │
│ 1 │ 'Z85' │ 5 │ '1.00KB' │ '64.580µs' │ '59.800µs' │ '322.900µs' │ '299.000µs' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ (index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '10.00KB' │ '32.600µs' │ '36.560µs' │ '163.000µs' │ '182.800µs' │
│ 1 │ 'Z85' │ 5 │ '10.00KB' │ '1.377ms' │ '1.210ms' │ '6.886ms' │ '6.049ms' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ (index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '100.00KB' │ '182.080µs' │ '243.120µs' │ '910.400µs' │ '1.216ms' │
│ 1 │ 'Z85' │ 5 │ '100.00KB' │ '4.706ms' │ '668.220µs' │ '23.528ms' │ '3.341ms' │
└─────────┴──────────┴───────────────────┴────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ (index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '500.00KB' │ '517.120µs' │ '1.340ms' │ '2.586ms' │ '6.702ms' │
│ 1 │ 'Z85' │ 5 │ '500.00KB' │ '15.727ms' │ '3.849ms' │ '78.637ms' │ '19.247ms' │
└─────────┴──────────┴───────────────────┴────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ (index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '1.00MB' │ '295.800µs' │ '1.587ms' │ '1.479ms' │ '7.937ms' │
│ 1 │ 'Z85' │ 5 │ '1.00MB' │ '36.169ms' │ '6.690ms' │ '180.846ms' │ '33.448ms' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬───────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ (index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼───────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '10.00MB' │ '3.596ms' │ '18.039ms' │ '17.978ms' │ '90.196ms' │
│ 1 │ 'Z85' │ 5 │ '10.00MB' │ '619.946ms' │ '81.798ms' │ '3.100s' │ '408.990ms' │
└─────────┴──────────┴───────────────────┴───────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
┌─────────┬──────────┬───────────────────┬────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┬────────────────────────────┐
│ (index) │ codec │ numberOfBenchRuns │ inputSize │ averageTimeElapsedToEncode │ averageTimeElapsedToDecode │ timeElapsedToEncodeAllRuns │ timeElapsedToDecodeAllRuns │
├─────────┼──────────┼───────────────────┼────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┼────────────────────────────┤
│ 0 │ 'base64' │ 5 │ '100.00MB' │ '81.588ms' │ '218.865ms' │ '407.941ms' │ '1.094s' │
│ 1 │ 'Z85' │ 5 │ '100.00MB' │ '7.420s' │ '836.813ms' │ '37.098s' │ '4.184s' │
└─────────┴──────────┴───────────────────┴────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┴────────────────────────────┘
``
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 39b | 20.000µs | 20.000µs | 100.000µs | 100.000µs |
| Z85 | 5 | 39b | 80.000µs | 40.000µs | 400.000µs | 200.000µs |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 1.00KB | 60.000µs | 0.00000ms | 300.000µs | 0.00000ms |
| Z85 | 5 | 1.00KB | 120.000µs | 100.000µs | 600.000µs | 500.000µs |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 10.00KB | 200.000µs | 40.000µs | 1.000ms | 200.000µs |
| Z85 | 5 | 10.00KB | 800.000µs | 260.000µs | 4.000ms | 1.300ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 100.00KB | 2.060ms | 540.000µs | 10.300ms | 2.700ms |
| Z85 | 5 | 100.00KB | 6.140ms | 1.680ms | 30.700ms | 8.400ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 500.00KB | 7.480ms | 2.000ms | 37.400ms | 10.000ms |
| Z85 | 5 | 500.00KB | 12.960ms | 3.980ms | 64.800ms | 19.900ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 1.00MB | 13.580ms | 3.820ms | 67.900ms | 19.100ms |
| Z85 | 5 | 1.00MB | 30.020ms | 7.440ms | 150.100ms | 37.200ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 10.00MB | 306.140ms | 94.060ms | 1.531s | 470.300ms |
| Z85 | 5 | 10.00MB | 911.360ms | 181.060ms | 4.557s | 905.300ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 100.00MB | 3.495s | 1.057s | 17.477s | 5.284s |
| Z85 | 5 | 100.00MB | 9.482s | 1.796s | 47.413s | 8.979s |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 39b | 0.00000ms | 0.00000ms | 0.00000ms | 0.00000ms |
| Z85 | 5 | 39b | 0.00000ms | 0.00000ms | 0.00000ms | 0.00000ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 1.00KB | 0.00000ms | 200.000µs | 0.00000ms | 1.000ms |
| Z85 | 5 | 1.00KB | 0.00000ms | 200.000µs | 0.00000ms | 1.000ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 10.00KB | 1.000ms | 0.00000ms | 5.000ms | 0.00000ms |
| Z85 | 5 | 10.00KB | 400.000µs | 0.00000ms | 2.000ms | 0.00000ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 100.00KB | 7.400ms | 1.400ms | 37.000ms | 7.000ms |
| Z85 | 5 | 100.00KB | 3.200ms | 2.600ms | 16.000ms | 13.000ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 500.00KB | 34.200ms | 3.200ms | 171.000ms | 16.000ms |
| Z85 | 5 | 500.00KB | 11.200ms | 8.000ms | 56.000ms | 40.000ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 1.00MB | 52.400ms | 5.600ms | 262.000ms | 28.000ms |
| Z85 | 5 | 1.00MB | 16.000ms | 15.000ms | 80.000ms | 75.000ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 10.00MB | 850.400ms | 74.600ms | 4.252s | 373.000ms |
| Z85 | 5 | 10.00MB | 258.800ms | 132.600ms | 1.294s | 663.000ms |
| codec | numberOfBenchRuns | inputSize | averageTimeElapsedToEncode | averageTimeElapsedToDecode | timeElapsedToEncodeAllRuns | timeElapsedToDecodeAllRuns |
|---|---|---|---|---|---|---|
| base64 | 5 | 100.00MB | 8.463s | 759.800ms | 42.316s | 3.799s |
| Z85 | 5 | 100.00MB | 2.762s | 1.194s | 13.809s | 5.971s |