zstd compression

This commit is contained in:
minjaesong
2024-01-11 22:27:19 +09:00
parent 234eb8e45f
commit c520c72141
9 changed files with 49 additions and 18 deletions

View File

@@ -1,6 +1,9 @@
package net.torvald.tsvm
import com.badlogic.gdx.utils.compression.Lzma
import io.airlift.compress.zstd.ZstdInputStream
import io.airlift.compress.zstd.ZstdOutputStream
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUint
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.util.zip.GZIPInputStream
@@ -77,13 +80,14 @@ class CompressorDelegate(private val vm: VM) {
companion object {
val GZIP_HEADER = byteArrayOf(31, -117, 8) // .gz in DEFLATE
val ZSTD_HEADER = byteArrayOf(40, -75, 47, -3)
fun comp(str: String) = comp(str.toByteArray(VM.CHARSET))
fun comp(ba: ByteArray): ByteArray {
val baos = ByteArrayOutputStream()
val gz = GZIPOutputStream(baos)
gz.write(ba); gz.flush(); gz.finish()
val gz = ZstdOutputStream(baos)
gz.write(ba); gz.flush(); gz.close()
baos.flush(); baos.close()
return baos.toByteArray()
}
@@ -92,10 +96,16 @@ class CompressorDelegate(private val vm: VM) {
fun decomp(str: String) = decomp(str.toByteArray(VM.CHARSET))
fun decomp(ba: ByteArray): ByteArray {
val header = ba[0].toUint().shl(24) or ba[1].toUint().shl(16) or ba[2].toUint().shl(8) or ba[3].toUint()
val bais = ByteArrayInputStream(ba)
val gz = GZIPInputStream(bais)
val ret = gz.readBytes()
gz.close(); bais.close()
val zis = when (header) {
in 0x1F8B0800..0x1F8B08FF -> GZIPInputStream(bais)
0x28B52FFD -> ZstdInputStream(bais)
else -> throw Error()
}
val ret = zis.readBytes()
zis.close(); bais.close()
return ret
}
}

View File

@@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.files.FileHandle
import net.torvald.tsvm.CompressorDelegate
import net.torvald.tsvm.CompressorDelegate.Companion.GZIP_HEADER
import net.torvald.tsvm.CompressorDelegate.Companion.ZSTD_HEADER
import net.torvald.tsvm.VM
import java.io.File
import kotlin.experimental.xor
@@ -27,9 +28,9 @@ open class VMProgramRom {
fun readAll(): String {
// check if bios is compressed in gzip
return if (contents.startsWith(byteArrayOf(31, -85, 26)))
return if (contents.startsWith(dec(GZIP_HEADER)) || contents.startsWith(dec(ZSTD_HEADER)))
CompressorDelegate.decomp(dec(contents)).toString(VM.CHARSET)
else if (contents.startsWith(GZIP_HEADER))
else if (contents.startsWith(GZIP_HEADER) || contents.startsWith(ZSTD_HEADER))
CompressorDelegate.decomp(contents).toString(VM.CHARSET)
else
contents.toString(VM.CHARSET)