
Implements ZeroMQ Base-85 encoding/decoding with 25% overhead, ASCII-safe output, automatic padding indicators, iterator-based streaming, and I/O stream helpers for efficient large-data processing.
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).
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:
_N where 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 decodingZ85.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 decodingThe 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 WriterInputStream.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 WriterThis library supports all Kotlin Multiplatform targets:
./gradlew build./gradlew testThis project is licensed under the MIT License - see the LICENSE file for details.
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).
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:
_N where 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 decodingZ85.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 decodingThe 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 WriterInputStream.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 WriterThis library supports all Kotlin Multiplatform targets:
./gradlew build./gradlew testThis project is licensed under the MIT License - see the LICENSE file for details.