40 lines
1.1 KiB
Kotlin
40 lines
1.1 KiB
Kotlin
@file:Suppress("JoinDeclarationAndAssignment")
|
|
|
|
package jp.juggler.apng
|
|
|
|
import jp.juggler.apng.util.StreamTokenizer
|
|
import java.util.zip.CRC32
|
|
|
|
internal class ApngChunk(crc32:CRC32,tokenizer: StreamTokenizer) {
|
|
val size: Int
|
|
val type: String
|
|
|
|
init {
|
|
size = tokenizer.readInt32()
|
|
val typeBytes = tokenizer.readBytes(4)
|
|
type = typeBytes.toString(Charsets.UTF_8)
|
|
|
|
crc32.update(typeBytes)
|
|
}
|
|
|
|
fun readBody(crc32:CRC32,tokenizer: StreamTokenizer): ByteArray {
|
|
val bytes = tokenizer.readBytes(size)
|
|
val crcExpect = tokenizer.readUInt32()
|
|
|
|
crc32.update(bytes, 0, size)
|
|
val crcActual = crc32.value
|
|
if (crcActual != crcExpect) throw ParseError("CRC not match.")
|
|
|
|
return bytes
|
|
}
|
|
|
|
fun skipBody(tokenizer: StreamTokenizer) {
|
|
tokenizer.skipBytes((size + 4).toLong())
|
|
}
|
|
|
|
fun checkCRC(tokenizer: StreamTokenizer, crcActual: Long) {
|
|
val crcExpect = tokenizer.readUInt32()
|
|
if (crcActual != crcExpect) throw ParseError("CRC not match.")
|
|
}
|
|
}
|