implement composition
This commit is contained in:
5
src/commonMain/kotlin/com/infendro/encoding/Base10.kt
Normal file
5
src/commonMain/kotlin/com/infendro/encoding/Base10.kt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package com.infendro.encoding
|
||||||
|
|
||||||
|
private val alphabet = "0123456789".encodeToByteArray()
|
||||||
|
|
||||||
|
object Base10 : Encoding by NumericEncoding(alphabet)
|
||||||
5
src/commonMain/kotlin/com/infendro/encoding/Base16.kt
Normal file
5
src/commonMain/kotlin/com/infendro/encoding/Base16.kt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package com.infendro.encoding
|
||||||
|
|
||||||
|
private val alphabet = "0123456789ABCDEF".encodeToByteArray()
|
||||||
|
|
||||||
|
object Base16 : Encoding by StreamEncoding(alphabet)
|
||||||
5
src/commonMain/kotlin/com/infendro/encoding/Base2.kt
Normal file
5
src/commonMain/kotlin/com/infendro/encoding/Base2.kt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package com.infendro.encoding
|
||||||
|
|
||||||
|
private val alphabet = "01".encodeToByteArray()
|
||||||
|
|
||||||
|
object Base2 : Encoding by StreamEncoding(alphabet)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.infendro.encoding.stream
|
package com.infendro.encoding
|
||||||
|
|
||||||
private val alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".encodeToByteArray()
|
private val alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".encodeToByteArray()
|
||||||
private const val padding = '='.code.toByte()
|
private const val padding = '='.code.toByte()
|
||||||
|
|
||||||
object Base32 : StreamEncoding(alphabet, padding)
|
object Base32 : Encoding by StreamEncoding(alphabet, padding)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
private val alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".encodeToByteArray()
|
private val alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".encodeToByteArray()
|
||||||
|
|
||||||
object Base36 : NumericEncoding(alphabet)
|
object Base36 : Encoding by NumericEncoding(alphabet)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
private val alphabet = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz".encodeToByteArray()
|
private val alphabet = "23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz".encodeToByteArray()
|
||||||
|
|
||||||
object Base56 : NumericEncoding(alphabet)
|
object Base56 : Encoding by NumericEncoding(alphabet)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
private val alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".encodeToByteArray()
|
private val alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz".encodeToByteArray()
|
||||||
|
|
||||||
object Base58 : NumericEncoding(alphabet)
|
object Base58 : Encoding by NumericEncoding(alphabet)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
private val alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".encodeToByteArray()
|
private val alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".encodeToByteArray()
|
||||||
|
|
||||||
object Base62 : NumericEncoding(alphabet)
|
object Base62 : Encoding by NumericEncoding(alphabet)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.infendro.encoding.stream
|
package com.infendro.encoding
|
||||||
|
|
||||||
private val alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".encodeToByteArray()
|
private val alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".encodeToByteArray()
|
||||||
private const val padding = '='.code.toByte()
|
private const val padding = '='.code.toByte()
|
||||||
|
|
||||||
object Base64 : StreamEncoding(alphabet, padding)
|
object Base64 : Encoding by StreamEncoding(alphabet, padding)
|
||||||
5
src/commonMain/kotlin/com/infendro/encoding/Base8.kt
Normal file
5
src/commonMain/kotlin/com/infendro/encoding/Base8.kt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package com.infendro.encoding
|
||||||
|
|
||||||
|
private val alphabet = "01234567".encodeToByteArray()
|
||||||
|
|
||||||
|
object Base8 : Encoding by StreamEncoding(alphabet)
|
||||||
@@ -1,15 +1,10 @@
|
|||||||
package com.infendro.encoding
|
package com.infendro.encoding
|
||||||
|
|
||||||
abstract class Encoding(
|
interface Encoding {
|
||||||
val alphabet: ByteArray,
|
val alphabet: ByteArray
|
||||||
) {
|
|
||||||
init {
|
|
||||||
require(alphabet.isNotEmpty())
|
|
||||||
}
|
|
||||||
|
|
||||||
val base: Int
|
val base: Int
|
||||||
get() = alphabet.size
|
get() = alphabet.size
|
||||||
|
|
||||||
abstract fun encode(bytes: ByteArray): ByteArray
|
fun encode(bytes: ByteArray): ByteArray
|
||||||
abstract fun decode(bytes: ByteArray): ByteArray
|
fun decode(bytes: ByteArray): ByteArray
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,21 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import com.infendro.encoding.exception.IllegalByteException
|
import com.infendro.encoding.exception.IllegalByteException
|
||||||
import com.infendro.encoding.util.BigInt
|
import com.infendro.encoding.util.BigInt
|
||||||
import com.infendro.encoding.util.log2
|
import com.infendro.encoding.util.log2
|
||||||
import kotlin.math.ceil
|
import kotlin.math.ceil
|
||||||
|
|
||||||
open class NumericEncoding(
|
class NumericEncoding internal constructor(
|
||||||
alphabet: ByteArray,
|
override val alphabet: ByteArray,
|
||||||
) : Encoding(alphabet) {
|
) : Encoding {
|
||||||
override fun encode(bytes: ByteArray): ByteArray {
|
override fun encode(bytes: ByteArray): ByteArray {
|
||||||
if (bytes.isEmpty()) return byteArrayOf()
|
if (bytes.isEmpty()) return byteArrayOf()
|
||||||
|
|
||||||
val size = ceil(bytes.size * 8 / log2(base)).toInt()
|
val size = ceil(bytes.size * 8 / log2(base)).toInt()
|
||||||
val result = ByteArray(size)
|
val result = ByteArray(size)
|
||||||
|
|
||||||
var x = BigInt.from(bytes)
|
|
||||||
var i = result.size
|
var i = result.size
|
||||||
|
var x = BigInt.from(bytes)
|
||||||
while (!x.isZero()) {
|
while (!x.isZero()) {
|
||||||
val (quotient, remainder) = x.divRem(base)
|
val (quotient, remainder) = x.divRem(base)
|
||||||
x = quotient
|
x = quotient
|
||||||
@@ -1,16 +1,15 @@
|
|||||||
package com.infendro.encoding.stream
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import com.infendro.encoding.exception.IllegalByteException
|
import com.infendro.encoding.exception.IllegalByteException
|
||||||
import com.infendro.encoding.util.align
|
import com.infendro.encoding.util.align
|
||||||
import com.infendro.encoding.util.divCeil
|
import com.infendro.encoding.util.divCeil
|
||||||
import com.infendro.encoding.util.lcm
|
import com.infendro.encoding.util.lcm
|
||||||
import com.infendro.encoding.util.log2
|
import com.infendro.encoding.util.log2
|
||||||
|
|
||||||
open class StreamEncoding(
|
class StreamEncoding internal constructor(
|
||||||
alphabet: ByteArray,
|
override val alphabet: ByteArray,
|
||||||
private val padding: Byte? = null,
|
private val padding: Byte? = null,
|
||||||
) : Encoding(alphabet) {
|
) : Encoding {
|
||||||
init {
|
init {
|
||||||
require(base and (base - 1) == 0)
|
require(base and (base - 1) == 0)
|
||||||
}
|
}
|
||||||
@@ -30,7 +29,6 @@ open class StreamEncoding(
|
|||||||
var r = 0
|
var r = 0
|
||||||
var buffer = 0
|
var buffer = 0
|
||||||
var bufferBits = 0
|
var bufferBits = 0
|
||||||
|
|
||||||
for (i in bytes.indices) {
|
for (i in bytes.indices) {
|
||||||
buffer = (buffer shl 8) + bytes[i]
|
buffer = (buffer shl 8) + bytes[i]
|
||||||
bufferBits += 8
|
bufferBits += 8
|
||||||
@@ -71,7 +69,6 @@ open class StreamEncoding(
|
|||||||
var r = 0
|
var r = 0
|
||||||
var buffer = 0
|
var buffer = 0
|
||||||
var bufferBits = 0
|
var bufferBits = 0
|
||||||
|
|
||||||
for (i in bytes.indices) {
|
for (i in bytes.indices) {
|
||||||
val byte = bytes[i]
|
val byte = bytes[i]
|
||||||
if (byte == padding) break
|
if (byte == padding) break
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package com.infendro.encoding.stream
|
|
||||||
|
|
||||||
private val alphabet = "0123456789ABCDEF".encodeToByteArray()
|
|
||||||
|
|
||||||
object Base16 : StreamEncoding(alphabet)
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package com.infendro.encoding.stream
|
|
||||||
|
|
||||||
private val alphabet = "01".encodeToByteArray()
|
|
||||||
|
|
||||||
object Base2 : StreamEncoding(alphabet)
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package com.infendro.encoding.stream
|
|
||||||
|
|
||||||
private val alphabet = "01234567".encodeToByteArray()
|
|
||||||
|
|
||||||
object Base8 : StreamEncoding(alphabet)
|
|
||||||
36
src/commonTest/kotlin/com/infendro/encoding/Base10.kt
Normal file
36
src/commonTest/kotlin/com/infendro/encoding/Base10.kt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package com.infendro.encoding
|
||||||
|
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
|
class `Base10 Test` {
|
||||||
|
val encoding: Encoding
|
||||||
|
get() = Base10
|
||||||
|
|
||||||
|
val original = "Hello World!".encodeToByteArray()
|
||||||
|
val encoded = "22405534230753928650781647905".encodeToByteArray()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `encode empty`() {
|
||||||
|
val actual = encoding.encode(byteArrayOf())
|
||||||
|
assertContentEquals(byteArrayOf(), actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `decode empty`() {
|
||||||
|
val actual = encoding.decode(byteArrayOf())
|
||||||
|
assertContentEquals(byteArrayOf(), actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun encode() {
|
||||||
|
val actual = encoding.encode(original)
|
||||||
|
assertContentEquals(encoded, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun decode() {
|
||||||
|
val actual = encoding.decode(encoded)
|
||||||
|
assertContentEquals(original, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.stream
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.stream
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.stream
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
@@ -9,7 +8,7 @@ class `Base56 Test` {
|
|||||||
get() = Base56
|
get() = Base56
|
||||||
|
|
||||||
val original = "Hello World!".encodeToByteArray()
|
val original = "Hello World!".encodeToByteArray()
|
||||||
val encoded = "4q9snPvV4iRDWVKjK".encodeToByteArray()
|
val encoded = "4Q9SNpVv4JrdwvjKj".encodeToByteArray()
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `encode empty`() {
|
fun `encode empty`() {
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.numeric
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.stream
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.infendro.encoding.stream
|
package com.infendro.encoding
|
||||||
|
|
||||||
import com.infendro.encoding.Encoding
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertContentEquals
|
import kotlin.test.assertContentEquals
|
||||||
|
|
||||||
Reference in New Issue
Block a user