Files
Terrarum/src/net/torvald/terrarum/serialise/ByteUtils.kt
2023-09-03 17:06:02 +09:00

118 lines
4.6 KiB
Kotlin

package net.torvald.terrarum.serialise
fun Int.toLittle() = byteArrayOf(
this.and(0xFF).toByte(),
this.ushr(8).and(0xFF).toByte(),
this.ushr(16).and(0xFF).toByte(),
this.ushr(24).and(0xFF).toByte()
)
/** Converts int as 2-byte array, discarding the sign.*/
fun Int.toULittleShort() = byteArrayOf(
this.and(0xFF).toByte(),
this.ushr(8).and(0xFF).toByte()
)
/** Converts int as 2-byte array, preserving the sign. In other words, it converts int to short. */
fun Int.toLittleShort() = byteArrayOf(
this.and(0xFF).toByte(),
this.shr(8).and(0xFF).toByte()
)
/** Converts long as 8-byte array */
fun Long.toLittle64() = byteArrayOf(
this.and(0xFF).toByte(),
this.ushr(8).and(0xFF).toByte(),
this.ushr(16).and(0xFF).toByte(),
this.ushr(24).and(0xFF).toByte(),
this.ushr(32).and(0xFF).toByte(),
this.ushr(40).and(0xFF).toByte(),
this.ushr(48).and(0xFF).toByte(),
this.ushr(56).and(0xFF).toByte(),
)
/** Converts long as 6-byte array, discarding the sign. */
fun Long.toULittle48() = byteArrayOf(
this.and(0xFF).toByte(),
this.ushr(8).and(0xFF).toByte(),
this.ushr(16).and(0xFF).toByte(),
this.ushr(24).and(0xFF).toByte(),
this.ushr(32).and(0xFF).toByte(),
this.ushr(40).and(0xFF).toByte(),
)
fun Long.toBig64() = byteArrayOf(
this.ushr(56).and(0xFF).toByte(),
this.ushr(48).and(0xFF).toByte(),
this.ushr(40).and(0xFF).toByte(),
this.ushr(32).and(0xFF).toByte(),
this.ushr(24).and(0xFF).toByte(),
this.ushr(16).and(0xFF).toByte(),
this.ushr(8).and(0xFF).toByte(),
this.and(0xFF).toByte(),
)
fun Double.toLittle() = java.lang.Double.doubleToRawLongBits(this).toLittle64()
fun Boolean.toLittle() = byteArrayOf(if (this) 0xFF.toByte() else 0.toByte())
fun ByteArray.toLittleInt32(offset: Int = 0) =
this[0 + offset].toUint() or
this[1 + offset].toUint().shl(8) or
this[2 + offset].toUint().shl(16) or
this[3 + offset].toUint().shl(24)
fun ByteArray.toULittleShort(offset: Int = 0) =
this[0 + offset].toUint() or
this[1 + offset].toUint().shl(8)
fun ByteArray.toLittleShort(offset: Int = 0) =
this[0 + offset].toUint() or
this[1 + offset].toInt().shl(8)
fun ByteArray.toLittleInt64(offset: Int = 0) =
this[0 + offset].toUlong() or
this[1 + offset].toUlong().shl(8) or
this[2 + offset].toUlong().shl(16) or
this[3 + offset].toUlong().shl(24) or
this[4 + offset].toUlong().shl(32) or
this[5 + offset].toUlong().shl(40) or
this[6 + offset].toUlong().shl(48) or
this[7 + offset].toUlong().shl(56)
fun ByteArray.toLittleInt48(offset: Int = 0) =
this[0 + offset].toUlong() or
this[1 + offset].toUlong().shl(8) or
this[2 + offset].toUlong().shl(16) or
this[3 + offset].toUlong().shl(24) or
this[4 + offset].toUlong().shl(32) or
this[5 + offset].toUlong().shl(40)
fun ByteArray.toLittleFloat() = java.lang.Float.intBitsToFloat(this.toLittleInt32())
fun ByteArray.toBigInt16(offset: Int = 0): Int {
return this[0 + offset].toUint().shl(8) or
this[1 + offset].toUint()
}
fun ByteArray.toBigInt24(offset: Int = 0): Int {
return this[0 + offset].toUint().shl(16) or
this[1 + offset].toUint().shl(8) or
this[2 + offset].toUint()
}
fun ByteArray.toBigInt32(offset: Int = 0): Int {
return this[0 + offset].toUint().shl(24) or
this[1 + offset].toUint().shl(16) or
this[2 + offset].toUint().shl(8) or
this[3 + offset].toUint()
}
fun ByteArray.toBigInt48(offset: Int = 0): Long {
return this[0 + offset].toUlong().shl(40) or
this[1 + offset].toUlong().shl(32) or
this[2 + offset].toUlong().shl(24) or
this[3 + offset].toUlong().shl(16) or
this[4 + offset].toUlong().shl(8) or
this[5 + offset].toUlong()
}
fun ByteArray.toBigInt64(offset: Int = 0): Long {
return this[0 + offset].toUlong().shl(56) or
this[1 + offset].toUlong().shl(48) or
this[2 + offset].toUlong().shl(40) or
this[3 + offset].toUlong().shl(32) or
this[4 + offset].toUlong().shl(24) or
this[5 + offset].toUlong().shl(16) or
this[6 + offset].toUlong().shl(8) or
this[7 + offset].toUlong()
}
fun Byte.toUlong() = java.lang.Byte.toUnsignedLong(this)
fun Byte.toUint() = java.lang.Byte.toUnsignedInt(this)