korlibs-archive / korio

Korio: Kotlin cORoutines I/O : Virtual File System + Async/Sync Streams + Async TCP Client/Server + WebSockets for Multiplatform Kotlin 1.3

Home Page:https://korlibs.soywiz.com/korio/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Support raw LZO (compatible with other LZO1X implementations)

SerVB opened this issue · comments

Wow, implementing #95 was all of a sudden! I've already checked it but looks like it doesn't work for me...

I have a file raw.bin with the size of 44868 bytes. I can compress it via my LZO based on the lzokay lib to a file lzo.lzo of 8672 bytes (it adds a header of 6 bytes and then delegates the compression to that lib). Uncompressing this file is possible via the original LZO implementation.

However, uncompressing it via korio lzo gives an exception. Can raw LZO be supported?

suspend fun main() {
    val raw = resourcesVfs["raw.bin"].readAll()
    println("raw size: ${raw.size}")

    val lzo = resourcesVfs["lzo.lzo"].readAll()
    println("lzo size: ${lzo.size}")

    val s = lzo.openFastStream()
    val lz = s.readBytes(2)
    val rawSize = s.readU32LE().toInt()
    val lzoData = s.readAll()

    println("${lz.map { it.toInt().toChar() }} $rawSize ${lzoData.size}")

    val rawCompressed = raw.compress(LZO)
    val size = LZO.Header().also { it.read(rawCompressed.openAsync()) }
    println("rawCompressed size: ${rawCompressed.size} $size")

    val rawCompressedUncompressed = rawCompressed.uncompress(LZO)
    println("rawCompressedUncompressed size: ${rawCompressedUncompressed.size}")

    val lzoUncompressed = lzoData.uncompress(LZO)
    println("lzoUncompressed size: ${lzoUncompressed.size}")

    val lzoUncompressedCompressed = lzoUncompressed.compress(LZO)
    println("lzoUncompressedCompressed size: ${lzoUncompressedCompressed.size}")
}
raw size: 44868
lzo size: 8672
[L, Z] 44868 8666
rawCompressed size: 89786 Header(version=4160, libVersion=8352, versionNeeded=2368, method=3, level=9, flags=0, filter=0, mode=33188, mtime=1635636518, GMTdiff=0, name=, checksum=0, uncompressedSize=44868, compressedSize=10633, checksumUncompressed=0, checksumCompressed=0)
rawCompressedUncompressed size: 44868
java.lang.IllegalStateException: INVALID LZO!
	at com.soywiz.korio.compression.lzo.LZO$Header.read(LZO.kt:36)
	at com.soywiz.korio.compression.lzo.LZO.uncompress$suspendImpl(LZO.kt:85)
	at com.soywiz.korio.compression.lzo.LZO.uncompress(LZO.kt)
	at com.soywiz.korio.compression.CompressionMethodKt.uncompress(CompressionMethod.kt:34)
	at com.soywiz.korio.compression.CompressionMethodKt$uncompress$2.invokeSuspend(CompressionMethod.kt:42)
	at com.soywiz.korio.compression.CompressionMethodKt$uncompress$2.invoke(CompressionMethod.kt)
	at com.soywiz.korio.compression.CompressionMethodKt$uncompress$2.invoke(CompressionMethod.kt)
	at com.soywiz.korio.async.RunBlockingNoSuspensionsKt.startCoroutineUndispatched(runBlockingNoSuspensions.kt:52)
	at com.soywiz.korio.async.RunBlockingNoSuspensionsKt.runBlockingNoSuspensions(runBlockingNoSuspensions.kt:19)
	at com.soywiz.korio.compression.CompressionMethodKt.uncompress(CompressionMethod.kt:41)
	at com.soywiz.korio.compression.CompressionMethodKt.uncompress(CompressionMethod.kt:49)
	at com.soywiz.korio.compression.CompressionMethodKt.uncompress$default(CompressionMethod.kt:49)
	at MainKt.main(main.kt:69)
	at MainKt$main$3.invoke(main.kt)
	at MainKt$main$3.invoke(main.kt)
	at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$1.invokeSuspend(IntrinsicsJvm.kt:205)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlin.coroutines.ContinuationKt.startCoroutine(Continuation.kt:115)
	at kotlin.coroutines.jvm.internal.RunSuspendKt.runSuspend(RunSuspend.kt:19)
	at MainKt.main(main.kt)

Files:
lzo.lzo.zip
raw.bin.zip

Thank you, I've just checked and it works for me. Also, I've taken a look a bit deeper in korio and see there is LzoRawDecompressor and LzoRawCompressor. This is exactly what I need, I guess I'll use these objects directly.