SubwayTooter-Android-App/base/src/main/java/jp/juggler/crypt/ByteRangeReader.kt

54 lines
1.4 KiB
Kotlin

package jp.juggler.crypt
class ByteRangeReader(
private val src: ByteRange,
) {
private val end = src.size
private var pos = 0
fun skip(length: Int) {
pos += length
}
fun readBytes(size: Int = end - pos): ByteRange {
if (pos + size > end) error("unexpected end.")
val rv = src.subRange(pos, pos + size)
pos += size
return rv
}
/**
* 残り全部
*/
fun remainBytes() = readBytes()
fun readUInt8(): Int {
if (pos >= end) error("unexpected end.")
val b = src[pos++]
return b.toInt().and(255)
}
fun readUInt16(): Int {
if (pos + 2 > end) error("unexpected end.")
// Big Endian
val b0 = src[pos].toInt().and(255).shl(8)
val b1 = src[pos + 1].toInt().and(255)
pos += 2
return b0.or(b1)
}
fun readUInt32(): Int {
if (pos + 4 > end) error("unexpected end.")
// Big Endian
val b0 = src[pos].toInt().and(255).shl(24)
val b1 = src[pos + 1].toInt().and(255).shl(16)
val b2 = src[pos + 2].toInt().and(255).shl(8)
val b3 = src[pos + 3].toInt().and(255)
pos += 4
return b0.or(b1).or(b2).or(b3)
}
}
fun ByteRange.byteRangeReader() = ByteRangeReader(this)
fun ByteArray.byteRangeReader() = ByteRangeReader(this.toByteRange())