From 9aeaf5638c181f33167eeb893561c4346af4f8a0 Mon Sep 17 00:00:00 2001 From: Sven Fiergolla Date: Fri, 13 Dec 2019 13:07:22 +0100 Subject: [PATCH] WIP --- .../encoder/mixed/MixedEncoder.kt | 8 +++---- .../extensions/ListExtensions.kt | 18 +++++++++++++++ .../ba/twoDimensionalRLE/model/DataChunk.kt | 22 ++++++++++++++----- 3 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 src/main/kotlin/edu/ba/twoDimensionalRLE/extensions/ListExtensions.kt diff --git a/src/main/kotlin/edu/ba/twoDimensionalRLE/encoder/mixed/MixedEncoder.kt b/src/main/kotlin/edu/ba/twoDimensionalRLE/encoder/mixed/MixedEncoder.kt index 6adfe1b..59a86c8 100644 --- a/src/main/kotlin/edu/ba/twoDimensionalRLE/encoder/mixed/MixedEncoder.kt +++ b/src/main/kotlin/edu/ba/twoDimensionalRLE/encoder/mixed/MixedEncoder.kt @@ -132,7 +132,7 @@ class MixedEncoder : Encoder { var totalSize = input.length() val huffmanEncoder = HuffmanEncoder() var chunks = DataChunk.readChunksFromFile(inputFile, byteArraySize, log) - val huffBuffer = StringBuffer() + val huffBuffer = mutableListOf() analyzer.analyzeFile(input) analyzer.addBWTSymbolsToMapping() @@ -158,15 +158,15 @@ class MixedEncoder : Encoder { printEncodingInfo() - log.info("Collecting all bytes to encode with huffman encoding to build dictionary...") + log.info("Collecting all bits to encode with huffman encoding to build dictionary...") //TODO improve buffer collecting chunks.forEach { for (i in HUFF_BIT_RANGE) { - huffBuffer.append(it.getLineFromChunkAsStringBuffer(i)) + huffBuffer.addAll(it.getLineFromChunkAsBoolList(i)) } } - log.debug("Creating byte array from ${huffBuffer.length} bit large buffer...") + log.debug("Creating byte array from ${huffBuffer.size} bit large buffer...") //TODO create better mapping creation to use less ram val huffBufferArray = huffBuffer.toByteArray() val huffmanMapping = huffmanEncoder.getHuffmanMapping(256, huffBufferArray) diff --git a/src/main/kotlin/edu/ba/twoDimensionalRLE/extensions/ListExtensions.kt b/src/main/kotlin/edu/ba/twoDimensionalRLE/extensions/ListExtensions.kt new file mode 100644 index 0000000..a5b8dd2 --- /dev/null +++ b/src/main/kotlin/edu/ba/twoDimensionalRLE/extensions/ListExtensions.kt @@ -0,0 +1,18 @@ +package edu.ba.twoDimensionalRLE.extensions + + +fun List.toByteArray(): ByteArray { + var result = ByteArray(0) + + this.chunked(8).forEach { chunk -> + var chunkValue = 0 + chunk.forEachIndexed { index , bit -> + if (bit) { + chunkValue += 2.pow(index) + } + } + + result += chunkValue.toByte() + } + return result +} \ No newline at end of file diff --git a/src/main/kotlin/edu/ba/twoDimensionalRLE/model/DataChunk.kt b/src/main/kotlin/edu/ba/twoDimensionalRLE/model/DataChunk.kt index 6f1a43f..fa0e727 100644 --- a/src/main/kotlin/edu/ba/twoDimensionalRLE/model/DataChunk.kt +++ b/src/main/kotlin/edu/ba/twoDimensionalRLE/model/DataChunk.kt @@ -55,11 +55,11 @@ open class DataChunk(val input: ByteArray) { rleRange: IntRange, huffRange: IntRange, huffDecodedBytes: ByteArray, - binRleBuffer: StringBuffer, + binRleBuffer: List, log: Logger ): List { log.info("Starting to reconstruct DataChunks from parsed buffers...") - var currentLinesOfChunk = mutableMapOf() + var currentLinesOfChunk = mutableMapOf>() var remainingSize = totalSize log.info("Building buffer from bytes...") @@ -79,13 +79,13 @@ open class DataChunk(val input: ByteArray) { //build bin rle decoded lines binRleRange.forEach { line -> - currentLinesOfChunk[line] = binRleBuffer.substring(0, currentLength) - binRleBuffer.delete(0, currentLength) + currentLinesOfChunk[line] = binRleBuffer.subList(0, currentLength) + binRleBuffer.subList(currentLength, binRleBuffer.size) } //huff decoded lines huffRange.forEach { line -> - currentLinesOfChunk[line] = remainingHuffmanBuffer.substring(0, currentLength) + currentLinesOfChunk[line] = remainingHuffmanBuffer.subSequence(0, currentLength) remainingHuffmanBuffer.delete(0, currentLength) } @@ -153,6 +153,18 @@ open class DataChunk(val input: ByteArray) { return bits } + fun getLineFromChunkAsBoolList(line: Int): List { + val bits = mutableListOf() + bytes.forEach { byte -> + if (byte.toInt().shl(7 - line).toUByte().toInt().shr(7) == 1) { + bits.add(true) + } else { + bits.add(false) + } + } + return bits + } + fun applyByteMapping(mapping: Map): DataChunk { val result = mutableListOf() bytes.forEach { byte ->