1
0
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:
Him188 2020-12-26 17:45:30 +08:00
parent bfda72e58f
commit bda4cee0ed
17 changed files with 53 additions and 53 deletions

View File

@ -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)

View File

@ -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

View File

@ -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()

View File

@ -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()
}

View File

@ -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.*

View File

@ -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
/**

View File

@ -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>(

View File

@ -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

View File

@ -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

View File

@ -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") {

View File

@ -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

View File

@ -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 {
/**

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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