A Kotlin Multiplatform implementation of Z85 (ZeroMQ Base-85) encoding, as specified in RFC32.
Z85 is a Base85 encoding format optimized for embedding binary data in strings. It encodes 4 bytes of binary data into 5 ASCII characters, providing better efficiency than Base64 (1.25x overhead vs 1.33x).
- Efficient: 25% overhead (vs 33% for Base64)
- ASCII-safe: Uses only printable ASCII characters (codes 33-126)
- Kotlin Multiplatform: Supports JVM, JS, Wasm, Linux, macOS, and Windows
- Automatic padding: Handles data of any length with automatic padding indicators
- Streaming support: Iterator-based encoding/decoding for large data
Add the dependency to your build.gradle.kts:
dependencies {
implementation("dev.ktool:z85:<version>")
}import dev.ktool.z85.*
// Encode a ByteArray
val data = byteArrayOf(
0x86.toByte(), 0x4F, 0xD2.toByte(), 0x6F,
0xB5.toByte(), 0x59, 0xF7.toByte(), 0x5B
)
val encoded: String = data.encodeZ85()
// Decode a Z85 string
val decoded: ByteArray = encoded.decodeZ85()The Z85 encoding requires the data to be divisible into 4 byte chunks. The implementation automatically handles data that isn't a multiple of 4 bytes by adding padding and a padding indicator:
// Data with 3 bytes (not divisible by 4)
val data = byteArrayOf(0x01, 0x02, 0x03)
val encoded = data.encodeZ85() // Ends with "_1" to indicate 1 byte of padding
// Decoding automatically removes padding
val decoded = encoded.decodeZ85() // Returns original 3 bytesFor processing large data streams:
// Encode a sequence
val byteSequence: Sequence<Byte> = // ... your data source
val encodedChars = byteSequence.encodeZ85()
// Decode a sequence
val charSequence: Sequence<Char> = // ... your Z85 data source
val decodedBytes = charSequence.decodeZ85()You can also use the Z85 object for more control:
// Encode
val encoded = Z85.encode(byteArray)
val encodedIterator = Z85.encode(byteIterator)
// Decode
val decoded = Z85.decode(encodedString)
val decodedIterator = Z85.decode(charIterator)When input data length is not a multiple of 4 bytes, the encoder:
- Pads the data with zeros to make it divisible by 4
- Appends a padding indicator in the format
_Nwhere N is '1', '2', or '3'
The underscore delimiter ensures the padding indicator is never confused with legitimate Z85 output.
Note: Empty ByteArray encodes to "0" as a special case.
ByteArray.encodeZ85(): String- Encode bytes to Z85 stringString.decodeZ85(): ByteArray- Decode Z85 string to bytesSequence<Byte>.encodeZ85(): Sequence<Char>- Stream encodingSequence<Char>.decodeZ85(): Sequence<Byte>- Stream decodingIterator<Byte>.encodeZ85(): Iterator<Char>- Iterator encodingIterator<Char>.decodeZ85(): Iterator<Byte>- Iterator decoding
Z85.encode(data: ByteArray): String- Encode bytes to Z85Z85.encode(data: Iterator<Byte>): Iterator<Char>- Stream encodingZ85.decode(string: String): ByteArray- Decode Z85 to bytesZ85.decode(chars: Iterator<Char>): Iterator<Byte>- Stream decoding
The library provides additional extension functions for working with Java I/O streams on the JVM platform:
InputStream.encodeZ85(): Iterator<Char>- Encode InputStream to Z85 charactersInputStream.encodeZ85(outputStream: OutputStream)- Encode and write to OutputStreamInputStream.encodeZ85(writer: Writer)- Encode and write to WriterBufferedInputStream.encodeZ85(): Iterator<Char>- Encode BufferedInputStream to Z85 charactersBufferedInputStream.encodeZ85(outputStream: OutputStream)- Encode and write to OutputStreamBufferedInputStream.encodeZ85(writer: Writer)- Encode and write to Writer
InputStream.decodeZ85(): Iterator<Byte>- Decode Z85 InputStream to bytesInputStream.decodeZ85(outputStream: OutputStream)- Decode and write to OutputStreamInputStream.decodeZ85(writer: Writer)- Decode and write to WriterBufferedInputStream.decodeZ85(): Iterator<Byte>- Decode BufferedInputStream to bytesBufferedInputStream.decodeZ85(outputStream: OutputStream)- Decode and write to OutputStreamBufferedInputStream.decodeZ85(writer: Writer)- Decode and write to Writer
This library supports all Kotlin Multiplatform targets:
- JVM (Java 17+)
- JavaScript (Browser and Node.js)
- WebAssembly (Browser and Node.js)
- Native
- Linux (x64)
- macOS (x64, ARM64)
- Windows (x64)
./gradlew build./gradlew testThis project is licensed under the MIT License - see the LICENSE file for details.