mirror of
https://github.com/mamoe/mirai.git
synced 2025-04-24 20:43:33 +08:00
Move utilities to mirai-core-utils
This commit is contained in:
parent
bfda72e58f
commit
bda4cee0ed
mirai-core-utils/src/commonMain/kotlin
mirai-core/src
commonMain/kotlin
commonTest/kotlin
@ -9,7 +9,7 @@
|
||||
|
||||
@file:Suppress("EXPERIMENTAL_UNSIGNED_LITERALS", "EXPERIMENTAL_API_USAGE", "unused")
|
||||
|
||||
package net.mamoe.mirai.internal.utils
|
||||
package net.mamoe.mirai.utils
|
||||
|
||||
/*
|
||||
* 类型转换 Utils.
|
||||
@ -19,7 +19,7 @@ package net.mamoe.mirai.internal.utils
|
||||
/**
|
||||
* 255 -> 00 FF
|
||||
*/
|
||||
internal fun Short.toByteArray(): ByteArray = with(toInt()) {
|
||||
public fun Short.toByteArray(): ByteArray = with(toInt()) {
|
||||
byteArrayOf(
|
||||
(shr(8) and 0xFF).toByte(),
|
||||
(shr(0) and 0xFF).toByte()
|
||||
@ -29,7 +29,7 @@ internal fun Short.toByteArray(): ByteArray = with(toInt()) {
|
||||
/**
|
||||
* 255 -> 00 00 00 FF
|
||||
*/
|
||||
internal fun Int.toByteArray(): ByteArray = byteArrayOf(
|
||||
public fun Int.toByteArray(): ByteArray = byteArrayOf(
|
||||
ushr(24).toByte(),
|
||||
ushr(16).toByte(),
|
||||
ushr(8).toByte(),
|
||||
@ -39,7 +39,7 @@ internal fun Int.toByteArray(): ByteArray = byteArrayOf(
|
||||
/**
|
||||
* 255 -> 00 00 00 FF
|
||||
*/
|
||||
internal fun Long.toByteArray(): ByteArray = byteArrayOf(
|
||||
public fun Long.toByteArray(): ByteArray = byteArrayOf(
|
||||
(ushr(56) and 0xFF).toByte(),
|
||||
(ushr(48) and 0xFF).toByte(),
|
||||
(ushr(40) and 0xFF).toByte(),
|
||||
@ -50,40 +50,40 @@ internal fun Long.toByteArray(): ByteArray = byteArrayOf(
|
||||
(ushr(0) and 0xFF).toByte()
|
||||
)
|
||||
|
||||
internal fun Int.toUHexString(separator: String = " "): String = this.toByteArray().toUHexString(separator)
|
||||
public fun Int.toUHexString(separator: String = " "): String = this.toByteArray().toUHexString(separator)
|
||||
|
||||
/**
|
||||
* 255 -> 00 FF
|
||||
*/
|
||||
internal fun UShort.toByteArray(): ByteArray = with(toUInt()) {
|
||||
public fun UShort.toByteArray(): ByteArray = with(toUInt()) {
|
||||
byteArrayOf(
|
||||
(shr(8) and 255u).toByte(),
|
||||
(shr(0) and 255u).toByte()
|
||||
)
|
||||
}
|
||||
|
||||
internal fun Short.toUHexString(separator: String = " "): String = this.toUShort().toUHexString(separator)
|
||||
public fun Short.toUHexString(separator: String = " "): String = this.toUShort().toUHexString(separator)
|
||||
|
||||
internal fun UShort.toUHexString(separator: String = " "): String =
|
||||
public fun UShort.toUHexString(separator: String = " "): String =
|
||||
this.toInt().shr(8).toUShort().toUByte().toUHexString() + separator + this.toUByte().toUHexString()
|
||||
|
||||
internal fun ULong.toUHexString(separator: String = " "): String =
|
||||
public fun ULong.toUHexString(separator: String = " "): String =
|
||||
this.toLong().toUHexString(separator)
|
||||
|
||||
internal fun Long.toUHexString(separator: String = " "): String =
|
||||
public fun Long.toUHexString(separator: String = " "): String =
|
||||
this.ushr(32).toUInt().toUHexString(separator) + separator + this.toUInt().toUHexString(separator)
|
||||
|
||||
/**
|
||||
* 255 -> 00 FF
|
||||
*/
|
||||
internal fun UByte.toByteArray(): ByteArray = byteArrayOf((this and 255u).toByte())
|
||||
public fun UByte.toByteArray(): ByteArray = byteArrayOf((this and 255u).toByte())
|
||||
|
||||
internal fun UByte.toUHexString(): String = this.toByte().toUHexString()
|
||||
public fun UByte.toUHexString(): String = this.toByte().toUHexString()
|
||||
|
||||
/**
|
||||
* 255u -> 00 00 00 FF
|
||||
*/
|
||||
internal fun UInt.toByteArray(): ByteArray = byteArrayOf(
|
||||
public fun UInt.toByteArray(): ByteArray = byteArrayOf(
|
||||
(shr(24) and 255u).toByte(),
|
||||
(shr(16) and 255u).toByte(),
|
||||
(shr(8) and 255u).toByte(),
|
||||
@ -93,31 +93,26 @@ internal fun UInt.toByteArray(): ByteArray = byteArrayOf(
|
||||
/**
|
||||
* 转 [ByteArray] 后再转 hex
|
||||
*/
|
||||
internal fun UInt.toUHexString(separator: String = " "): String = this.toByteArray().toUHexString(separator)
|
||||
public fun UInt.toUHexString(separator: String = " "): String = this.toByteArray().toUHexString(separator)
|
||||
|
||||
/**
|
||||
* 转无符号十六进制表示, 并补充首位 `0`.
|
||||
* 转换结果示例: `FF`, `0E`
|
||||
*/
|
||||
internal fun Byte.toUHexString(): String = this.toUByte().fixToUHex()
|
||||
public fun Byte.toUHexString(): String = this.toUByte().fixToUHex()
|
||||
|
||||
/**
|
||||
* 转无符号十六进制表示, 并补充首位 `0`.
|
||||
*/
|
||||
internal fun Byte.fixToUHex(): String = this.toUByte().fixToUHex()
|
||||
public fun Byte.fixToUHex(): String = this.toUByte().fixToUHex()
|
||||
|
||||
/**
|
||||
* 转无符号十六进制表示, 并补充首位 `0`.
|
||||
*/
|
||||
internal fun UByte.fixToUHex(): String =
|
||||
public fun UByte.fixToUHex(): String =
|
||||
if (this.toInt() in 0..15) "0${this.toString(16).toUpperCase()}" else this.toString(16).toUpperCase()
|
||||
|
||||
/**
|
||||
* 将无符号 Hex 转为 [ByteArray], 有根据 hex 的 [hashCode] 建立的缓存.
|
||||
*
|
||||
* 这个方法很累, 不建议经常使用.
|
||||
*/
|
||||
internal fun String.hexToBytes(): ByteArray =
|
||||
public fun String.hexToBytes(): ByteArray =
|
||||
this.split(" ")
|
||||
.asSequence()
|
||||
.filterNot { it.isEmpty() }
|
||||
@ -130,25 +125,21 @@ internal fun String.hexToBytes(): ByteArray =
|
||||
*
|
||||
* 这个方法很累, 不建议经常使用.
|
||||
*/
|
||||
internal fun String.chunkedHexToBytes(): ByteArray =
|
||||
public fun String.chunkedHexToBytes(): ByteArray =
|
||||
this.asSequence().chunked(2).map { (it[0].toString() + it[1]).toUByte(16).toByte() }.toList().toByteArray()
|
||||
|
||||
/**
|
||||
* 删掉全部空格和换行后每 2 char 为一组, 转换 Hex 为 [ByteArray].
|
||||
*
|
||||
* 这个方法很累, 不建议经常使用.
|
||||
*/
|
||||
internal fun String.autoHexToBytes(): ByteArray =
|
||||
public fun String.autoHexToBytes(): ByteArray =
|
||||
this.replace("\n", "").replace(" ", "").asSequence().chunked(2).map {
|
||||
(it[0].toString() + it[1]).toUByte(16).toByte()
|
||||
}.toList().toByteArray()
|
||||
|
||||
/**
|
||||
* 将无符号 Hex 转为 [UByteArray], 有根据 hex 的 [hashCode] 建立的缓存.
|
||||
*
|
||||
* 这个方法很累, 不建议经常使用.
|
||||
*/
|
||||
internal fun String.hexToUBytes(): UByteArray =
|
||||
public fun String.hexToUBytes(): UByteArray =
|
||||
this.split(" ")
|
||||
.asSequence()
|
||||
.filterNot { it.isEmpty() }
|
||||
@ -164,15 +155,17 @@ internal fun String.hexToUBytes(): UByteArray =
|
||||
* 一个 [Int] 有 32 bits
|
||||
* 本函数将 4 个 [Byte] 的 bits 连接得到 [Int]
|
||||
*/
|
||||
internal fun ByteArray.toUInt(): UInt =
|
||||
(this[0].toUInt().and(255u) shl 24) + (this[1].toUInt().and(255u) shl 16) + (this[2].toUInt().and(255u) shl 8) + (this[3].toUInt().and(
|
||||
public fun ByteArray.toUInt(): UInt =
|
||||
(this[0].toUInt().and(255u) shl 24) + (this[1].toUInt().and(255u) shl 16) + (this[2].toUInt()
|
||||
.and(255u) shl 8) + (this[3].toUInt().and(
|
||||
255u
|
||||
) shl 0)
|
||||
|
||||
internal fun ByteArray.toUShort(): UShort =
|
||||
public fun ByteArray.toUShort(): UShort =
|
||||
((this[0].toUInt().and(255u) shl 8) + (this[1].toUInt().and(255u) shl 0)).toUShort()
|
||||
|
||||
internal fun ByteArray.toInt(): Int =
|
||||
(this[0].toInt().and(255) shl 24) + (this[1].toInt().and(255) shl 16) + (this[2].toInt().and(255) shl 8) + (this[3].toInt().and(
|
||||
public fun ByteArray.toInt(): Int =
|
||||
(this[0].toInt().and(255) shl 24) + (this[1].toInt().and(255) shl 16) + (this[2].toInt()
|
||||
.and(255) shl 8) + (this[3].toInt().and(
|
||||
255
|
||||
) shl 0)
|
@ -27,6 +27,7 @@ import net.mamoe.mirai.internal.utils.*
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.toByteArray
|
||||
import net.mamoe.mirai.message.data.*
|
||||
import net.mamoe.mirai.utils.hexToBytes
|
||||
import net.mamoe.mirai.utils.safeCast
|
||||
import net.mamoe.mirai.utils.unzip
|
||||
import net.mamoe.mirai.utils.zip
|
||||
|
@ -14,13 +14,13 @@ import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.Transient
|
||||
import net.mamoe.mirai.internal.network.protocol.data.proto.HummerCommelem
|
||||
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
|
||||
import net.mamoe.mirai.internal.utils.hexToBytes
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.toByteArray
|
||||
import net.mamoe.mirai.internal.utils.toByteArray
|
||||
import net.mamoe.mirai.message.code.internal.appendAsMiraiCode
|
||||
import net.mamoe.mirai.message.data.Face
|
||||
import net.mamoe.mirai.message.data.MarketFace
|
||||
import net.mamoe.mirai.utils.MiraiExperimentalApi
|
||||
import net.mamoe.mirai.utils.hexToBytes
|
||||
import net.mamoe.mirai.utils.toByteArray
|
||||
|
||||
internal val FACE_BUF = "00 01 00 04 52 CC F5 D0".hexToBytes()
|
||||
|
||||
|
@ -17,7 +17,6 @@ import net.mamoe.mirai.IMirai
|
||||
import net.mamoe.mirai.contact.Contact
|
||||
import net.mamoe.mirai.contact.Group
|
||||
import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody
|
||||
import net.mamoe.mirai.internal.utils.hexToBytes
|
||||
import net.mamoe.mirai.message.data.FriendImage
|
||||
import net.mamoe.mirai.message.data.GroupImage
|
||||
import net.mamoe.mirai.message.data.Image
|
||||
@ -28,6 +27,7 @@ import net.mamoe.mirai.message.data.md5
|
||||
import net.mamoe.mirai.utils.ExternalResource
|
||||
import net.mamoe.mirai.utils.MiraiExperimentalApi
|
||||
import net.mamoe.mirai.utils.generateImageId
|
||||
import net.mamoe.mirai.utils.hexToBytes
|
||||
|
||||
/*
|
||||
* ImgType:
|
||||
@ -162,6 +162,7 @@ internal class ExperimentalDeferredImage internal constructor(
|
||||
override suspend fun getUrl(bot: Bot): String {
|
||||
TODO()
|
||||
}
|
||||
|
||||
override val imageId: String = externalImage.calculateResourceId()
|
||||
}
|
||||
|
||||
|
@ -31,7 +31,6 @@ import net.mamoe.mirai.internal.utils.io.readPacketExact
|
||||
import net.mamoe.mirai.internal.utils.io.readString
|
||||
import net.mamoe.mirai.internal.utils.io.useBytes
|
||||
import net.mamoe.mirai.internal.utils.io.withUse
|
||||
import net.mamoe.mirai.internal.utils.toInt
|
||||
import net.mamoe.mirai.internal.utils.toReadPacket
|
||||
import net.mamoe.mirai.internal.utils.toUHexString
|
||||
import net.mamoe.mirai.utils.*
|
||||
|
@ -18,9 +18,9 @@ import kotlinx.io.core.writeFully
|
||||
import net.mamoe.mirai.internal.network.protocol.LoginType
|
||||
import net.mamoe.mirai.internal.utils.NetworkType
|
||||
import net.mamoe.mirai.internal.utils.io.*
|
||||
import net.mamoe.mirai.internal.utils.toByteArray
|
||||
import net.mamoe.mirai.utils.currentTimeMillis
|
||||
import net.mamoe.mirai.utils.md5
|
||||
import net.mamoe.mirai.utils.toByteArray
|
||||
import kotlin.random.Random
|
||||
|
||||
/**
|
||||
|
@ -20,10 +20,10 @@ import net.mamoe.mirai.internal.network.protocol.data.proto.MsgSvc
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacketFactory
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket
|
||||
import net.mamoe.mirai.internal.utils.hexToBytes
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.readProtoBuf
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.toByteArray
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf
|
||||
import net.mamoe.mirai.utils.hexToBytes
|
||||
|
||||
internal class PbMessageSvc {
|
||||
object PbMsgWithDraw : OutgoingPacketFactory<PbMsgWithDraw.Response>(
|
||||
|
@ -53,6 +53,7 @@ import net.mamoe.mirai.message.data.PlainText
|
||||
import net.mamoe.mirai.message.data.buildMessageChain
|
||||
import net.mamoe.mirai.utils.cast
|
||||
import net.mamoe.mirai.utils.debug
|
||||
import net.mamoe.mirai.utils.toInt
|
||||
import net.mamoe.mirai.utils.warning
|
||||
import kotlin.random.Random
|
||||
|
||||
|
@ -51,6 +51,7 @@ import net.mamoe.mirai.internal.utils.io.serialization.*
|
||||
import net.mamoe.mirai.utils.currentTimeSeconds
|
||||
import net.mamoe.mirai.utils.debug
|
||||
import net.mamoe.mirai.utils.mapToIntArray
|
||||
import net.mamoe.mirai.utils.toUHexString
|
||||
|
||||
|
||||
//0C 01 B1 89 BE 09 5E 3D 72 A6 00 01 73 68 FC 06 00 00 00 3C
|
||||
|
@ -22,7 +22,7 @@ import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.jceRequestSBuffer
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.readUniPacket
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.writeJceStruct
|
||||
import net.mamoe.mirai.internal.utils.toByteArray
|
||||
import net.mamoe.mirai.utils.toByteArray
|
||||
|
||||
internal class ProfileService {
|
||||
object GroupMngReq : OutgoingPacketFactory<GroupMngReq.GroupMngReqResponse>("ProfileService.GroupMngReq") {
|
||||
|
@ -22,12 +22,12 @@ import net.mamoe.mirai.internal.network.protocol.data.jce.RequestPacket
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.IncomingPacketFactory
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.OutgoingPacket
|
||||
import net.mamoe.mirai.internal.network.protocol.packet.buildResponseUniPacket
|
||||
import net.mamoe.mirai.internal.utils.hexToBytes
|
||||
import net.mamoe.mirai.internal.utils.io.ProtoBuf
|
||||
import net.mamoe.mirai.internal.utils.io.serialization.*
|
||||
import net.mamoe.mirai.internal.utils.io.withUse
|
||||
import net.mamoe.mirai.internal.utils.toReadPacket
|
||||
import net.mamoe.mirai.utils.ByteArrayPool
|
||||
import net.mamoe.mirai.utils.hexToBytes
|
||||
import net.mamoe.mirai.utils.verbose
|
||||
import net.mamoe.mirai.internal.network.protocol.data.jce.PushReq as PushReqJceStruct
|
||||
|
||||
|
@ -19,10 +19,7 @@ import net.mamoe.mirai.internal.utils.*
|
||||
import net.mamoe.mirai.internal.utils.crypto.TEA
|
||||
import net.mamoe.mirai.internal.utils.guidFlag
|
||||
import net.mamoe.mirai.internal.utils.io.*
|
||||
import net.mamoe.mirai.utils.currentTimeSeconds
|
||||
import net.mamoe.mirai.utils.error
|
||||
import net.mamoe.mirai.utils.generateDeviceInfoData
|
||||
import net.mamoe.mirai.utils.md5
|
||||
import net.mamoe.mirai.utils.*
|
||||
|
||||
internal class WtLogin {
|
||||
/**
|
||||
|
@ -14,6 +14,7 @@ package net.mamoe.mirai.internal.utils
|
||||
import kotlinx.serialization.Transient
|
||||
import net.mamoe.mirai.utils.MiraiLogger
|
||||
import net.mamoe.mirai.utils.debug
|
||||
import net.mamoe.mirai.utils.toUHexString
|
||||
import java.lang.reflect.Modifier
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.reflect.KProperty
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
package net.mamoe.mirai.internal.utils.crypto
|
||||
|
||||
import net.mamoe.mirai.internal.utils.chunkedHexToBytes
|
||||
import net.mamoe.mirai.utils.chunkedHexToBytes
|
||||
|
||||
internal expect interface ECDHPrivateKey
|
||||
|
||||
|
@ -10,9 +10,9 @@
|
||||
package net.mamoe.mirai.internal.utils.crypto
|
||||
|
||||
import kotlinx.io.core.ByteReadPacket
|
||||
import net.mamoe.mirai.internal.utils.toByteArray
|
||||
import net.mamoe.mirai.internal.utils.toUHexString
|
||||
import net.mamoe.mirai.utils.ByteArrayPool
|
||||
import net.mamoe.mirai.utils.toByteArray
|
||||
import net.mamoe.mirai.utils.toUHexString
|
||||
import kotlin.experimental.and
|
||||
import kotlin.experimental.xor
|
||||
import kotlin.random.Random
|
||||
|
@ -17,8 +17,8 @@ import kotlinx.io.charsets.Charset
|
||||
import kotlinx.io.charsets.Charsets
|
||||
import kotlinx.io.core.*
|
||||
import net.mamoe.mirai.internal.utils.toReadPacket
|
||||
import net.mamoe.mirai.internal.utils.toUHexString
|
||||
import net.mamoe.mirai.utils.ByteArrayPool
|
||||
import net.mamoe.mirai.utils.toUHexString
|
||||
import kotlin.contracts.InvocationKind
|
||||
import kotlin.contracts.contract
|
||||
|
||||
@ -47,7 +47,7 @@ private inline fun <R> inline(block: () -> R): R = block()
|
||||
internal typealias TlvMap = MutableMap<Int, ByteArray>
|
||||
|
||||
internal inline fun TlvMap.getOrFail(tag: Int): ByteArray {
|
||||
return this[tag] ?: error("cannot find tlv 0x${tag. toUHexString("")}($tag)")
|
||||
return this[tag] ?: error("cannot find tlv 0x${tag.toUHexString("")}($tag)")
|
||||
}
|
||||
|
||||
internal inline fun TlvMap.getOrFail(tag: Int, lazyMessage: (tag: Int) -> String): ByteArray {
|
||||
@ -59,7 +59,11 @@ internal inline fun Input._readTLVMap(tagSize: Int = 2, suppressDuplication: Boo
|
||||
_readTLVMap(true, tagSize, suppressDuplication)
|
||||
|
||||
@Suppress("DuplicatedCode", "FunctionName")
|
||||
internal fun Input._readTLVMap(expectingEOF: Boolean = true, tagSize: Int, suppressDuplication: Boolean = true): TlvMap {
|
||||
internal fun Input._readTLVMap(
|
||||
expectingEOF: Boolean = true,
|
||||
tagSize: Int,
|
||||
suppressDuplication: Boolean = true
|
||||
): TlvMap {
|
||||
val map = mutableMapOf<Int, ByteArray>()
|
||||
var key = 0
|
||||
|
||||
|
@ -8,6 +8,8 @@
|
||||
*/
|
||||
package net.mamoe.mirai.internal.utils
|
||||
|
||||
import net.mamoe.mirai.utils.hexToBytes
|
||||
import net.mamoe.mirai.utils.toByteArray
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertTrue
|
||||
|
Loading…
Reference in New Issue
Block a user