Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
Mirai
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
MyCard
Mirai
Commits
2e17ea68
Commit
2e17ea68
authored
Jan 23, 2020
by
jiahua.liu
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
4d67c2e4
434e6511
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
2594 additions
and
94 deletions
+2594
-94
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
...moe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
+5
-6
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/OutgoingPacketAndroid.kt
...qandroid/network/protocol/packet/OutgoingPacketAndroid.kt
+11
-13
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt
.../mirai/qqandroid/network/protocol/packet/PacketFactory.kt
+18
-16
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/ImagePacket.kt
...rai/qqandroid/network/protocol/packet/chat/ImagePacket.kt
+2
-3
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
...ai/qqandroid/network/protocol/packet/login/LoginPacket.kt
+4
-21
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/SvcReqRegisterPacket.kt
...oid/network/protocol/packet/login/SvcReqRegisterPacket.kt
+5
-5
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/TransEmpPacket.kt
...qqandroid/network/protocol/packet/login/TransEmpPacket.kt
+2
-2
mirai-core-qqandroid/src/jvmTest/kotlin/androidPacketTests/clientToServer.kt
...d/src/jvmTest/kotlin/androidPacketTests/clientToServer.kt
+25
-28
mirai-debug/build.gradle.kts
mirai-debug/build.gradle.kts
+8
-0
mirai-debug/src/test/java/jce/jce/HexUtil.java
mirai-debug/src/test/java/jce/jce/HexUtil.java
+79
-0
mirai-debug/src/test/java/jce/jce/JceDecodeException.java
mirai-debug/src/test/java/jce/jce/JceDecodeException.java
+7
-0
mirai-debug/src/test/java/jce/jce/JceEncodeException.java
mirai-debug/src/test/java/jce/jce/JceEncodeException.java
+7
-0
mirai-debug/src/test/java/jce/jce/JceInputStream$HeadData.java
...-debug/src/test/java/jce/jce/JceInputStream$HeadData.java
+11
-0
mirai-debug/src/test/java/jce/jce/JceInputStream.java
mirai-debug/src/test/java/jce/jce/JceInputStream.java
+1008
-0
mirai-debug/src/test/java/jce/jce/JceOutputStream.java
mirai-debug/src/test/java/jce/jce/JceOutputStream.java
+430
-0
mirai-debug/src/test/java/jce/jce/JceStruct.java
mirai-debug/src/test/java/jce/jce/JceStruct.java
+78
-0
mirai-debug/src/test/java/jce/jce/JceUtil.java
mirai-debug/src/test/java/jce/jce/JceUtil.java
+594
-0
mirai-debug/src/test/java/jce/jce/OnIllegalArgumentException.java
...bug/src/test/java/jce/jce/OnIllegalArgumentException.java
+7
-0
mirai-debug/src/test/kotlin/jceTest/jceTest.kt
mirai-debug/src/test/kotlin/jceTest/jceTest.kt
+293
-0
No files found.
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt
View file @
2e17ea68
...
...
@@ -11,7 +11,6 @@ import net.mamoe.mirai.qqandroid.event.PacketReceivedEvent
import
net.mamoe.mirai.qqandroid.network.protocol.packet.KnownPacketFactories
import
net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.LoginPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.PacketId
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.RegPushReason
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.SvcReqRegisterPacket
import
net.mamoe.mirai.utils.*
...
...
@@ -101,12 +100,12 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
*/
suspend
fun
parsePacket
(
input
:
Input
)
{
try
{
KnownPacketFactories
.
parseIncomingPacket
(
bot
,
input
)
{
packet
:
Packet
,
packetId
:
PacketId
,
sequenceId
:
Int
->
KnownPacketFactories
.
parseIncomingPacket
(
bot
,
input
)
{
packet
:
Packet
,
commandName
:
String
,
sequenceId
:
Int
->
if
(
PacketReceivedEvent
(
packet
).
broadcast
().
cancelled
)
{
return
@
parseIncomingPacket
}
packetListeners
.
forEach
{
listener
->
if
(
listener
.
filter
(
packetId
,
sequenceId
)
&&
packetListeners
.
remove
(
listener
))
{
if
(
listener
.
filter
(
commandName
,
sequenceId
)
&&
packetListeners
.
remove
(
listener
))
{
listener
.
complete
(
packet
)
}
}
...
...
@@ -202,7 +201,7 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
}
suspend
fun
<
E
:
Packet
>
OutgoingPacket
.
sendAndExpect
():
E
{
val
handler
=
PacketListener
(
packetId
=
packetId
,
sequenceId
=
sequenceId
)
val
handler
=
PacketListener
(
commandName
=
commandName
,
sequenceId
=
sequenceId
)
packetListeners
.
addLast
(
handler
)
//println(delegate.readBytes().toUHexString())
println
(
"Sending length="
+
delegate
.
remaining
)
...
...
@@ -217,10 +216,10 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler
@PublishedApi
internal
inner
class
PacketListener
(
val
packetId
:
PacketId
,
val
commandName
:
String
,
val
sequenceId
:
Int
)
:
CompletableDeferred
<
Packet
>
by
CompletableDeferred
(
supervisor
)
{
fun
filter
(
packetId
:
PacketId
,
sequenceId
:
Int
)
=
this
.
packetId
==
packetId
&&
this
.
sequenceId
==
sequenceId
fun
filter
(
commandName
:
String
,
sequenceId
:
Int
)
=
this
.
commandName
==
commandName
&&
this
.
sequenceId
==
sequenceId
}
override
suspend
fun
awaitDisconnection
()
=
supervisor
.
join
()
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/OutgoingPacketAndroid.kt
View file @
2e17ea68
...
...
@@ -6,8 +6,6 @@ import kotlinx.io.core.ByteReadPacket
import
kotlinx.io.core.buildPacket
import
kotlinx.io.core.writeFully
import
net.mamoe.mirai.qqandroid.network.QQAndroidClient
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.LoginPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.PacketId
import
net.mamoe.mirai.utils.MiraiInternalAPI
import
net.mamoe.mirai.utils.cryptor.DecrypterByteArray
import
net.mamoe.mirai.utils.cryptor.encryptAndWrite
...
...
@@ -23,12 +21,12 @@ import net.mamoe.mirai.utils.io.writeQQ
@UseExperimental
(
ExperimentalUnsignedTypes
::
class
)
internal
class
OutgoingPacket
constructor
(
name
:
String
?,
val
packetId
:
PacketId
,
val
commandName
:
String
,
val
sequenceId
:
Int
,
val
delegate
:
ByteReadPacket
)
{
val
name
:
String
by
lazy
{
name
?:
packetId
.
toString
()
name
?:
commandName
.
toString
()
}
}
...
...
@@ -66,13 +64,13 @@ internal val EMPTY_BYTE_ARRAY = ByteArray(0)
internal
inline
fun
PacketFactory
<*>.
buildOutgingPacket
(
client
:
QQAndroidClient
,
name
:
String
?
=
null
,
id
:
PacketId
=
this
.
id
,
commandName
:
String
=
this
.
commandName
,
key
:
ByteArray
,
body
:
BytePacketBuilder
.(
sequenceId
:
Int
)
->
Unit
):
OutgoingPacket
{
val
sequenceId
:
Int
=
client
.
nextSsoSequenceId
()
return
OutgoingPacket
(
name
,
id
,
sequenceId
,
buildPacket
{
return
OutgoingPacket
(
name
,
commandName
,
sequenceId
,
buildPacket
{
writeIntLVPacket
(
lengthOffset
=
{
it
+
4
})
{
writeInt
(
0
x0B
)
writeByte
(
1
)
...
...
@@ -113,13 +111,13 @@ internal inline fun PacketFactory<*>.buildLoginOutgoingPacket(
bodyType
:
Byte
,
extraData
:
ByteArray
=
EMPTY_BYTE_ARRAY
,
name
:
String
?
=
null
,
id
:
PacketId
=
this
.
id
,
commandName
:
String
=
this
.
commandName
,
key
:
ByteArray
=
KEY_16_ZEROS
,
body
:
BytePacketBuilder
.(
sequenceId
:
Int
)
->
Unit
):
OutgoingPacket
{
val
sequenceId
:
Int
=
client
.
nextSsoSequenceId
()
return
OutgoingPacket
(
name
,
id
,
sequenceId
,
buildPacket
{
return
OutgoingPacket
(
name
,
commandName
,
sequenceId
,
buildPacket
{
writeIntLVPacket
(
lengthOffset
=
{
it
+
4
})
{
writeInt
(
0
x00_00_00_0A
)
writeByte
(
bodyType
)
...
...
@@ -168,10 +166,10 @@ private val BRP_STUB = ByteReadPacket(EMPTY_BYTE_ARRAY)
* byte[] body()
*/
@UseExperimental
(
MiraiInternalAPI
::
class
)
internal
inline
fun
BytePacketBuilder
.
write
Login
SsoPacket
(
internal
inline
fun
BytePacketBuilder
.
writeSsoPacket
(
client
:
QQAndroidClient
,
subAppId
:
Long
,
packetId
:
PacketId
,
commandName
:
String
,
extraData
:
ByteReadPacket
=
BRP_STUB
,
sequenceId
:
Int
,
body
:
BytePacketBuilder
.()
->
Unit
...
...
@@ -187,7 +185,7 @@ internal inline fun BytePacketBuilder.writeLoginSsoPacket(
writeInt
((
extraData
.
remaining
+
4
).
toInt
())
writePacket
(
extraData
)
}
packetId
.
commandName
.
let
{
commandName
.
let
{
writeInt
(
it
.
length
+
4
)
writeStringUtf8
(
it
)
}
...
...
@@ -269,7 +267,7 @@ internal inline fun PacketFactory<*>.buildSessionOutgoingPacket(
internal
fun
BytePacketBuilder
.
writeOicqRequestPacket
(
client
:
QQAndroidClient
,
encryptMethod
:
EncryptMethod
,
packetId
:
PacketId
,
commandId
:
Int
,
bodyBlock
:
BytePacketBuilder
.()
->
Unit
)
{
val
body
=
encryptMethod
.
makeBody
(
client
,
bodyBlock
)
...
...
@@ -278,7 +276,7 @@ internal fun BytePacketBuilder.writeOicqRequestPacket(
writeByte
(
0
x02
)
// head
writeShort
((
27
+
2
+
body
.
remaining
).
toShort
())
// orthodox algorithm
writeShort
(
client
.
protocolVersion
)
writeShort
(
packetId
.
commandId
.
toShort
())
writeShort
(
commandId
.
toShort
())
writeShort
(
1
)
// const??
writeQQ
(
client
.
uin
)
writeByte
(
3
)
// originally const
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/PacketFactory.kt
View file @
2e17ea68
...
...
@@ -5,9 +5,6 @@ import kotlinx.io.pool.useInstance
import
net.mamoe.mirai.data.Packet
import
net.mamoe.mirai.qqandroid.QQAndroidBot
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.LoginPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.NullPacketId
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.NullPacketId.commandName
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.PacketId
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.SvcReqRegisterPacket
import
net.mamoe.mirai.utils.DefaultLogger
import
net.mamoe.mirai.utils.MiraiLogger
...
...
@@ -23,18 +20,17 @@ import kotlin.jvm.JvmName
* 应由一个 `object` 实现, 且实现 `operator fun invoke` 或按 subCommand 或其意义命名的函数来构造 [OutgoingPacket]
*
* @param TPacket 服务器回复包解析结果
* @param TDecrypter 服务器回复包解密器
*/
@UseExperimental
(
ExperimentalUnsignedTypes
::
class
)
internal
abstract
class
PacketFactory
<
out
TPacket
:
Packet
>
{
@Suppress
(
"PropertyName"
)
internal
var
_id
:
PacketId
=
NullPacketId
internal
lateinit
var
_commandName
:
String
/**
*
包 ID.
*
命令名. 如 `wtlogin.login`, `ConfigPushSvc.PushDomain`
*/
open
val
id
:
PacketId
get
()
=
_id
open
val
commandName
:
String
get
()
=
_commandName
/**
* **解码**服务器的回复数据包
...
...
@@ -45,9 +41,9 @@ internal abstract class PacketFactory<out TPacket : Packet> {
@JvmName
(
"decode0"
)
private
suspend
inline
fun
<
P
:
Packet
>
PacketFactory
<
P
>.
decode
(
bot
:
QQAndroidBot
,
packet
:
ByteReadPacket
):
P
=
packet
.
decode
(
bot
)
private
val
DECRYPTER_16_ZERO
=
ByteArray
(
16
)
internal
val
DECRYPTER_16_ZERO
=
ByteArray
(
16
)
internal
typealias
PacketConsumer
=
suspend
(
packet
:
Packet
,
packetId
:
PacketId
,
ssoSequenceId
:
Int
)
->
Unit
internal
typealias
PacketConsumer
=
suspend
(
packet
:
Packet
,
packetId
:
String
,
ssoSequenceId
:
Int
)
->
Unit
@PublishedApi
internal
val
PacketLogger
:
MiraiLogger
=
DefaultLogger
(
"Packet"
)
...
...
@@ -58,10 +54,7 @@ internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf(
SvcReqRegisterPacket
)
{
fun
findPacketFactory
(
commandName
:
String
):
PacketFactory
<
*
>
=
this
.
first
{
it
.
id
.
commandName
==
commandName
}
fun
findPacketFactory
(
commandId
:
Int
):
PacketFactory
<
*
>
=
this
.
first
{
it
.
id
.
commandName
==
commandName
}
fun
findPacketFactory
(
commandName
:
String
):
PacketFactory
<
*
>?
=
this
.
firstOrNull
{
it
.
commandName
==
commandName
}
// 00 00 08 70 00 00 00 0A 01 00 00 00 00 0E 31 39 39 34 37 30 31 30 32 31 F5 45 50 03 B7 F7 99 8F DC CE F6 A2 35 08 04 85 D6 1D 52 90 24 13 86 A2 9D 40 D9 CD BF 4B 08 56 E7 EF 37 E6 E7 BE 09 FD A8 E5 D8 DA 07 90 E5 CB 22 1A 5A 77 88 B5 1A 0B 36 2A 71 59 1C 79 7C B1 84 39 CF 74 31 C5 ED 4D BB 12 F3 BB 10 B2 2E CD 05 82 86 AC 78 68 74 C3 42 9F CF F9 14 0D D4 2B 89 E9 FC 4D 1D 29 F3 08 A0 3A 62 F3 B5 71 D3 A9 06 BD 45 BA 50 D6 2D 68 05 B7 B4 D3 07 D0 01 A4 F4 71 0A 76 34 1F CA 2D 3A 53 6A C5 44 CA 56 C9 FA 0F 81 5E 06 63 45 9B BD FA 81 D3 50 46 74 34 C2 A8 21 9B 1B 25 E6 23 38 E5 87 B4 D2 A7 E7 59 65 03 BB 6D 46 D5 21 66 F6 2F 2D BF A3 77 2A 33 9D E1 35 18 45 CE 22 DB C1 52 BB 87 B9 F0 CB B1 CD 39 81 43 BD C1 E5 2B 81 DE 29 EC 72 2A 56 14 23 67 7B 60 F7 FB C1 7F 9C 18 8E ED 67 35 3E 2F EA D1 EA 24 AD 12 6D 65 B3 27 0C 2B 0A 43 42 3E 0C 81 C5 02 7D E6 A5 2C 79 8D 53 2D 06 F1 EE A5 51 BC 24 A6 F5 F2 0C BC 1F 42 F2 21 8F FB DF 9C 98 6F 25 FB D0 09 E1 F3 85 76 A2 96 39 5E 73 06 24 F8 1E 6C F7 D3 03 15 44 BA 6B 42 9E CE 14 7B 1A F9 0B A1 9A 85 FD 52 2B 34 FB 0F D8 6F 34 38 6E F3 A2 7D EB DF 3F 55 6A 52 27 35 44 5C 26 05 F3 36 8E 8F 00 D2 31 85 BF 20 8A 1C 37 57 C4 74 36 BF 89 3F 44 3C 97 AA 6B 8F D1 B6 CD D6 45 88 F1 74 35 CD 8B 85 9F 60 F4 B7 00 3E 87 10 C4 3F 7C 3F 22 F0 20 58 40 CE E6 77 8B 3D EE AA EB 31 52 65 BE C4 12 2B 28 65 1A 26 16 55 E9 86 28 90 42 FD 48 D6 6F E6 63 E2 40 3F BE 68 C6 FE A7 B2 10 31 15 7E B4 C7 2C 8D D9 04 8D AD 8E 45 D2 CA EC 07 D6 D0 14 FD 93 02 4B 3D 71 6E 3E 1F D5 BC ED 98 0E 01 6B FE 1C 96 24 34 DF A3 E3 EE 67 40 F3 C7 AA 10 4E 44 62 49 D5 45 14 15 49 04 2F 9F FC 5D 40 F7 5A CC C1 78 7B 37 35 80 F9 10 80 EB 40 DB 33 06 5F 2A 70 88 F0 94 49 59 48 4B 00 66 28 E9 E9 E7 CE E4 CA 6D 21 79 09 62 7A 6E C5 47 A4 08 85 73 43 35 2D EE E4 0E 85 47 92 B4 F1 5C 76 C2 72 BC D1 70 41 6D 9B EE F4 47 67 1F 63 57 B9 65 C1 08 5C 42 D6 28 FB 6F F5 1A 4B E0 B7 5A 36 75 E6 BE ED C6 67 DA 64 19 09 11 CF 9A 74 4A F4 4E 4F 1E 02 2C 8C 21 21 DE 76 15 34 E5 F2 DF F9 34 31 99 4F 4B B2 5E E6 2B 8D 7C 64 E9 7D 78 98 4F 28 FF 2E 95 1B 5D 8E 2F 70 E6 01 0A 82 18 90 16 8F 98 5E 0F CA 30 4F 36 AF 9B 5E 2B 5B FE 59 5E 11 BC A5 68 64 55 BD 04 CE 43 60 4C C9 CB F7 88 D2 30 7A 89 75 3D 93 9D A9 D0 CE 7D 4B CE 4D 14 5E 95 0E 18 3E 75 AE 20 C6 8A 6E 15 F9 39 58 3B 17 74 99 98 07 5D 68 B1 51 57 AF 1D 85 F1 A5 8A FE 9F 07 BC CB B9 84 A5 49 AE 9F F4 50 06 27 24 7F EB 66 C0 F7 C4 4F E9 74 FA 69 8E D0 A6 A4 3E 8A A8 D9 10 A1 05 03 0F B1 E7 80 22 A9 21 22 FA 31 A1 61 0E 5A 42 75 5F 19 95 2E FE A9 38 51 BB E9 C1 6B 29 CD AE 8F 78 7C 1F A4 81 F2 20 D3 15 C1 EA 42 BD 5F 52 C1 BA 5F C7 42 97 A8 F1 FA C6 20 82 3C 00 36 96 75 69 27 FE 93 AA BD 43 BD 0E FD ED 30 97 A6 B2 A2 E8 D3 75 C2 BF 35 EC 78 8A 3E 23 9D 6D DD 3C D4 4A BC 5A A8 74 86 3C A7 31 F5 F3 8A 78 9C 3C 75 88 B1 35 4A 83 91 EB 5F 80 F3 E0 0C EC 82 5C 7B 08 61 45 E3 3B 7B F1 1F BC 6D 5E 99 3A 34 68 28 20 42 8C 42 C9 0A 3F 32 42 03 E5 9A 71 BB E1 02 C9 B4 98 6E 73 7E EC 81 79 28 01 A8 E5 AC 0F 24 0A 58 DA C1 D2 F0 2C 94 E7 4D E5 ED B3 43 58 23 73 1D 7F 33 B0 7B 1A A8 C1 AC 6E 7C F1 A6 51 0F CF E9 51 5F 06 EB 79 C4 0C E9 78 6C B8 B8 11 C0 2E 84 BC F4 4D 05 D5 B5 90 20 30 BE 73 28 83 91 3B 4D 90 2E 8F A5 A8 BF 85 63 29 05 04 33 14 7D 24 24 7D 02 9B 39 5D 30 D0 68 58 57 1A 0D 67 A6 EF 44 4C 4E 92 14 0A 2A E4 24 1E 60 78 A3 65 71 7E E3 B2 44 E1 55 3E F2 08 05 F5 59 5E EE D3 0A 12 34 C2 FC 74 4A 8C F9 BE 7F 4D EC 9E D3 14 97 7F DF 75 E2 52 21 95 65 99 F4 1D 01 AD F4 D2 4D 8C 9E 5A 16 DE 65 AA D0 AC 24 17 FE BE B9 D8 9B FB 36 33 E5 AE 1B F9 B1 AE A4 9B 15 94 91 6D 45 BE 61 33 4B 71 40 BC DB D0 BF 06 39 83 D5 5F 30 6D E0 20 D3 33 AA 78 13 DA 9A 80 A3 38 4F 3B F8 AE B9 7F 9B B7 F1 AD 10 88 96 DD 79 DD F8 86 A3 72 A2 3F C2 6E B2 6D CE 36 54 90 5F DE 23 90 CD BD BD DB 95 83 5A 94 8E B8 54 AF 0A AB 10 0C 15 B3 3D 2B 89 7D 83 64 B9 29 08 50 40 6E F6 EC 8D E7 79 6C 2B 70 A5 07 FA AD 6A A1 54 EC D7 C7 70 A6 9F 8F 8E 5B 00 5E 8D 27 0D 21 8B 38 31 02 88 13 6E F4 5C 8D 15 82 FC 3E AE 57 17 3D 6D 38 F9 8C 2B EF 87 FA 30 FB 59 D4 E2 49 CF 76 75 9C 9D 50 8D 4A CD AE F6 3C 59 E8 92 BB C1 E2 5C F6 96 8B DC 78 DF E1 27 6B F1 1C D9 68 1D 29 8A E3 09 DD 28 C7 0A ED BB 75 6B D9 87 9F 7F 71 5D D0 EE 03 5B 28 52 40 26 DD C9 C4 52 4D 58 02 3A 71 BE 6C F4 6A 30 14 52 72 CB 45 95 80 DE 28 02 8A 22 7A 05 B5 D7 22 61 06 E0 34 09 AC A9 A8 A8 D0 DF 37 BE 3F 86 33 CA B0 EA 27 A5 95 A5 F8 1C A9 C5 46 41 EB DF C8 5F AD 85 7A 0E A8 AD A9 2A BF F3 6F 39 0D AE 60 30 B2 23 3C D0 37 85 18 01 2E 4E 74 0B 5D 98 2E 1E 3B 3F 30 DC CB DA 1E 0A 4F 0B 70 74 54 28 4F 82 6C 11 7E 5C 7E 33 C7 BB 47 29 2B F6 92 01 3F 83 AE 50 CC 6E B5 87 3B D4 F6 3A 6D 8D 0D 98 37 AB A6 08 79 EE E9 AB 38 37 FA 22 4C 54 80 1F 88 E9 E9 45 37 7A AF DB 61 A9 37 61 30 05 38 46 E4 CD ED B4 71 B2 C7 2E 1F 4C 92 27 C5 AF 3C D9 26 60 1F 4E 65 5E EF F7 A7 9C CC 49 F5 20 58 60 47 ED 44 DF EF FF AD 91 24 28 28 A4 03 F3 10 1B E5 18 0D 49 FA 68 A3 F2 BA 77 32 E4 16 35 66 8F 2C 8E 04 19 5A 26 AE 8C EB D1 C4 6F 0E 38 85 B7 3C 79 F4 98 29 35 FF DF 13 03 FE 36 D7 0A 20 3D 28 14 DE A1 D4 12 5B 6B D0 BF 53 4C AB 36 4E 3A FB 91 73 9C 39 F0 AB 10 1A 25 D6 D6 AC 2F 68 E5 33 67 23 EF 7A 97 70 2C F7 0B 67 0F A6 11 CB AB EF A9 3F 67 5B 8D 1B 39 C9 99 56 79 92 44 6E 1B 6F EE FE E9 08 9C 8B D6 5D 5A 8E 7B BD 61 A4 97 B2 78 75 98 5D C3 19 79 28 26 8B 00 32 D3 E1 3A 02 7F 12 D1 02 2C 5D 27 B3 F0 A6 8B 9D B1 01 01 EC AB 0F 6D D5 E4 0B B0 BD 54 9C 73 CD C0 AB F8 7E D4 D4 D3 3C E9 05 B3 30 30 3D C6 A4 70 EA 0B D1 47 CB 71 41 27 09 DA FE 4A 0F D2 1C 28 EF A6 3E 7A F6 05 A0 52 72 A3 C0 05 BC 8E 38 69 C5 16 AD 98 9D 96 4F FB 95 1D BD B7 12 26 AB 7D E2 EA 57 2C BB 1C 12 C9 FF 90 FB 6B 4F 3D FE 26 7D 4B FF A6 8D 4C D7 FA 4E ED B1 5F 5B 92 92 68 B5 25 0C BC 56 C7 AE 01 C4 05 9A A6 7E 97 93 4E 15 67 83 40 F7 45 8C F8 FB D8 C4 5A D0 94 15 AF 33 24 4A 4E 43 A6 B7 D4 AC 0C EB 39 C9 83 D3 E1 CE 36 6B AC CE FD 3C 92 2D 5D C2 6A 1C C4 54 21 4E 06 8B BB CB 7D B4 C2 FF 53 00 3C A4 47 98 AC 7E 29 AF B2 AB EB 25 1A 7E 3C E0 C6 DF 65 13 64 C1 94 EA 86 3F CD 54 E1 5E C5 95 3D F8 C0 A5 6B 28 CA 4F B4 5A E6 93 CE 49 5E AD CD A1 6E B8 94 9D C4 C3 0E 37 C4 10 A8 C0 47 17 C4 EE 3D 61 B5 80 ED EF 5B CC B4 49 69 10 4D E9 CD 22 B3 1B 1C 52 29 9D 6D B2 84 76 C3 CE 3C 23 39 0D 68 02 6B 1F 3F 28 DA 59 78 AE EA D8 F4 E0 1B 90 21 81 77 23 52 05 53 A1 BD E7 50 1C 24 26 9F 1D 39 E4 F2 A0 F8 7E F7 29 58 41 98 12 62 1A 23 B3 D9 A4 5C D3 15 0D 04 31 48 03 1B CC 5F A0 D1 A9 75 5C D0 FD 8A 9C FA 24 89 B2 C3 A9 C2 13 5B CD 1C F9 B1 63 C7 01 D7 BD 0D 43 2F CB 6C 4B 4F 0D
// 00 00 08 E0 00 00 00 0A 01 00 00 00 00 0E 31 39 39 34 37 30 31 30 32 31 B4 16 A6 D7 A3 E4 9E 53 99 CD 77 14 70 1F 51 3E 8B 79 F6 93 2B E0 92 E4 32 E2 87 6C 3A 9C 1B 29 87 CB 3C 60 45 9C 41 71 63 6A F6 99 FC 05 01 68 86 B3 6F 37 97 52 C5 D3 0E 66 B3 F6 40 CC EB 18 A3 AE 15 3E 31 B1 E9 7C 6F EC E4 4D 31 F1 1E 2C 0C 1C 45 66 CD F7 1B 90 11 9A D8 CE DD 6D 6C 63 9F EB CD 69 33 AF 6C 8E BA 8C CB C3 FF 27 A2 A6 C3 28 06 4A B5 79 79 12 AB 52 04 62 CA 7D 11 59 85 5C 0B D6 8D 2A E7 9C 04 97 62 7D 05 11 3E 2C 11 60 E3 E3 B3 DA 7A 7C 13 AF 22 01 53 80 69 D0 F9 C8 86 EC 25 8C F3 67 5C 82 45 08 FB 34 43 50 01 0E EA 43 77 D8 CF EC 55 E6 4E 66 5B 26 21 C9 E8 78 92 AE 5C 61 F0 5E 0B E7 34 1F 53 D6 EA 28 9C 02 1A E9 F0 55 61 4B 06 F8 56 3B AC 93 B2 2C CD 66 0D D1 18 CB BD 29 50 DE 0F 82 6D 28 63 AB 21 E1 6C BA B1 9F 69 A4 E3 C9 20 F8 11 82 39 04 2B 54 44 50 FA 2E 86 68 6D DC 5D 9E 18 F4 DD 19 09 BC CF E8 41 68 A3 8D 86 42 80 51 C4 C1 ED 54 DB 50 F5 1D A7 28 2A 0D E8 14 1A 4E F7 96 29 00 6C 9D 4A 2E 3E 7B 4C AC 20 78 F1 3C 70 6B 61 96 D7 EC 77 AD CB AD AF BB 47 C3 1F A0 6C 6C 9C 9F F3 6C EB 6C A4 D0 7F 2B E1 AA 68 26 99 B9 C8 A1 F5 C4 7E E7 E7 81 EE 66 00 96 33 49 C0 EE A2 F9 F6 52 C5 A6 5D EE 9D C5 E5 CE DA 31 FC FF 4B 02 97 68 3D 6A 99 4A CF 69 D9 F4 53 68 31 E7 32 2F 85 E7 7F 16 82 AE FA 73 D5 42 09 9C CB 53 26 79 41 63 80 B0 E2 6A 8B B9 C6 71 08 B4 2B E0 48 D3 C4 0F B0 00 D0 FA 8C 29 DE E9 71 6A D7 89 76 E7 5D 33 14 10 6F E2 44 6A A0 DC C1 CB F3 9A C3 13 CB D1 82 2C DF 34 68 79 E3 09 BD CC 2B 25 79 A8 E7 BE 29 6C 97 C3 D7 F4 0E CC 2B 74 71 02 BA 2B 5B 57 1B C2 C8 C2 BF 54 23 72 EA E4 38 54 20 7D 88 E4 39 7C C5 8A 1B C0 EC D2 1E 7D 1B 6B 7A BC EC 73 1E 53 4A 6F 4F EA F0 56 12 80 BD 0B 37 67 BD FD A8 29 23 2D 8E 66 7E 31 A9 F6 CE 7E BC 4F 38 D0 33 D4 C7 4A E9 43 9D 28 2E 8F 7C D5 81 F4 8C F9 6F 21 AC A1 08 FD F4 01 FB E8 CE 61 91 BE 68 5B E4 3A 5F F8 FB DA 5D 9B 2A AF E2 0C D3 A4 1F 42 90 96 E1 28 44 85 8D E1 CF 19 A9 47 04 8D 28 D9 B3 35 79 48 70 D9 ED 45 B6 24 B5 56 FA 1E DE 02 F3 EB 69 08 7D 24 9C 60 35 97 8D 13 4A 5A 57 BA B3 14 C1 EE 70 22 CA B2 65 F7 BB 3F A2 D9 14 AA 4C 52 E6 E4 10 D3 FD C6 2B DD BF C0 CF E5 35 57 9E 9F D0 77 C8 E6 EF 2B 8E 01 88 96 F8 68 95 A7 0D 58 81 30 60 88 44 CC 31 5B C1 D4 92 6E ED 17 CA 0A 01 69 90 4E 6A C0 D7 09 6C E5 33 64 CA 6E 5C 07 C3 AD 46 36 F9 DF DE B7 71 B2 87 CB 3D 76 C0 44 B8 6B 15 27 B2 03 99 C7 51 8A 00 35 C9 1C 76 55 32 AE 49 5A 34 6A 4E FD 20 7A 24 BF 34 E8 B4 18 BC 92 64 A1 F3 0A 2E 7B 00 EA B6 52 E7 AC 34 FD AE FF 1E 5D 6D D6 1F 6D 06 31 09 9D A9 9C 86 DB 5E 05 07 BA 4A 49 2B D2 7F EE 88 64 B2 6F 15 70 39 1B E9 57 6A 4E 29 4A A4 57 EA 80 3D 86 4C E9 F7 F5 2B C4 9F 35 62 76 09 0E 1C A4 99 50 99 82 2F 84 90 0E 9E 9F 75 C3 15 B0 61 34 D1 67 2D 30 16 FE D3 BF 59 6A B1 74 02 C4 EF 92 85 E0 16 4B 0C C5 9D 65 BB 5D 52 8F 52 5B 7C 7B 74 D9 EC 41 A9 5B FA 2D 95 D4 AE 5D F1 68 88 F6 82 ED 09 05 21 2E 5D 93 64 A0 96 15 64 A6 50 3C 03 2B FC 3E 80 89 90 62 CC D9 23 8E D7 BD 05 02 30 86 32 31 6A 5F F8 C4 BD 61 D0 CE B9 54 4E 93 E9 AE B9 4F 2B 98 DC 23 31 CC A8 06 89 A8 08 60 99 DC D4 81 98 13 C9 27 36 32 24 C1 B0 6B F0 3D EB CC 3B 32 5F 20 72 23 B3 DF 0B 48 3C 35 FD F1 FB DC 3E 2A BE B9 0F 42 56 F1 39 94 86 85 C6 1E A0 4C EC B8 69 45 5F 3D AB 3C 3B A2 70 61 91 9D 2C DD 6D C5 E9 EF 47 36 A6 A3 E0 96 C2 B8 EF 92 E9 E0 26 88 C6 B5 51 BA DE FD C5 BA 4C 6A 9A FE 6F DE B8 10 05 7F 9C 5D 40 11 39 75 CD 36 4F 6B A8 A1 94 57 5F 8F F2 D0 E2 36 A0 A4 24 05 FD 9E F5 51 93 C9 6E 5A 10 8D C3 33 2D E5 09 7A E0 DB 44 63 9C EA A5 ED BF 0B 98 32 F1 BA 04 96 F6 14 49 F1 F8 58 EA 6E 5E 5E 49 CA 2D E2 93 E6 AD 20 B2 CD 98 A7 3E BA 3E A8
...
...
@@ -109,7 +102,7 @@ internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf(
}).
getOrElse
{
PacketLogger
.
verbose
(
"失败, 尝试其他各种key"
)
bot
.
client
.
tryDecryptOrNull
(
this
)
{
it
.
toReadPacket
()
}
}
?.
let
{
decryptedData
->
}
?.
also
{
decryptedData
->
when
(
flag1
)
{
0
x0A
->
parseLoginSsoPacket
(
bot
,
decryptedData
,
consumer
)
0
x0B
->
parseUniPacket
(
bot
,
decryptedData
,
consumer
)
...
...
@@ -143,8 +136,10 @@ internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf(
val
ssoSequenceId
:
Int
readIoBuffer
(
readInt
()
-
4
).
withUse
{
ssoSequenceId
=
readInt
()
PacketLogger
.
verbose
(
"sequenceId = $ssoSequenceId"
)
check
(
readInt
()
==
0
)
val
loginExtraData
=
readIoBuffer
(
readInt
()
-
4
)
val
extraData
=
readIoBuffer
(
readInt
()
-
4
)
PacketLogger
.
verbose
(
"sso(inner)extraData = $extraData"
)
commandName
=
readString
(
readInt
()
-
4
)
val
unknown
=
readBytes
(
readInt
()
-
4
)
...
...
@@ -154,8 +149,15 @@ internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf(
}
bot
.
logger
.
verbose
(
commandName
)
// TODO: 2020/1/23 在这里处理 Uni 解析
val
packetFactory
=
findPacketFactory
(
commandName
)
if
(
packetFactory
==
null
)
{
bot
.
logger
.
warning
(
"找不到包 PacketFactory"
)
return
}
val
qq
:
Long
val
subCommandId
:
Int
readIoBuffer
(
readInt
()
-
4
).
withUse
{
...
...
@@ -199,7 +201,7 @@ internal object KnownPacketFactories : List<PacketFactory<*>> by mutableListOf(
else
->
error
(
"Illegal encryption method. expected 0 or 4, got $encryptionMethod"
)
}
consumer
(
packet
,
packetFactory
.
id
,
ssoSequenceId
)
consumer
(
packet
,
packetFactory
.
commandName
,
ssoSequenceId
)
}
}
}
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/ImagePacket.kt
View file @
2e17ea68
...
...
@@ -6,13 +6,12 @@ import kotlinx.serialization.Serializable
import
net.mamoe.mirai.data.Packet
import
net.mamoe.mirai.qqandroid.QQAndroidBot
import
net.mamoe.mirai.qqandroid.network.protocol.packet.PacketFactory
import
net.mamoe.mirai.qqandroid.network.protocol.packet.login.PacketId
import
net.mamoe.mirai.utils.currentTimeSeconds
@UseExperimental
(
ExperimentalUnsignedTypes
::
class
)
internal
object
ImagePacket
:
PacketFactory
<
ImagePacket
.
RequestImgUrlResponse
>()
{
init
{
this
.
_
id
=
PacketId
(
commandId
=
0
x0000
,
commandName
=
"LongConn.OffPicDown"
)
this
.
_
commandName
=
"LongConn.OffPicDown"
}
...
...
@@ -21,7 +20,7 @@ internal object ImagePacket : PacketFactory<ImagePacket.RequestImgUrlResponse>()
}
fun
createCmd0x325Packet
(
req
:
ImgReq
,
networkType
:
Int
=
5
):
Cmd0x352Packet
{
private
fun
createCmd0x325Packet
(
req
:
ImgReq
,
networkType
:
Int
=
5
):
Cmd0x352Packet
{
if
(
req
is
UploadImgReq
)
return
Cmd0x352Packet
(
1
,
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/LoginPacket.kt
View file @
2e17ea68
...
...
@@ -25,7 +25,7 @@ import net.mamoe.mirai.utils.io.discardExact
@UseExperimental
(
ExperimentalUnsignedTypes
::
class
)
internal
object
LoginPacket
:
PacketFactory
<
LoginPacket
.
LoginPacketResponse
>()
{
init
{
this
.
_
id
=
PacketId
(
commandId
=
0
x0810
,
commandName
=
"wtlogin.login"
)
this
.
_
commandName
=
"wtlogin.login"
}
object
SubCommand9
{
...
...
@@ -36,8 +36,8 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>() {
operator
fun
invoke
(
client
:
QQAndroidClient
):
OutgoingPacket
=
buildLoginOutgoingPacket
(
client
,
bodyType
=
2
)
{
sequenceId
->
write
LoginSsoPacket
(
client
,
subAppId
,
id
,
sequenceId
=
sequenceId
)
{
writeOicqRequestPacket
(
client
,
EncryptMethodECDH7
(
client
.
ecdh
),
id
)
{
write
SsoPacket
(
client
,
subAppId
,
commandName
,
sequenceId
=
sequenceId
)
{
writeOicqRequestPacket
(
client
,
EncryptMethodECDH7
(
client
.
ecdh
),
0
x0810
)
{
writeShort
(
9
)
// subCommand
writeShort
(
17
)
// count of TLVs, probably ignored by server?
//writeShort(LoginType.PASSWORD.value.toShort())
...
...
@@ -563,21 +563,4 @@ internal object LoginPacket : PacketFactory<LoginPacket.LoginPacketResponse>() {
// SEE oicq_request.java at method analysisT17f
}
}
}
@Suppress
(
"FunctionName"
)
internal
fun
PacketId
(
commandId
:
Int
,
commandName
:
String
)
=
object
:
PacketId
{
override
val
commandId
:
Int
get
()
=
commandId
override
val
commandName
:
String
get
()
=
commandName
}
internal
interface
PacketId
{
val
commandId
:
Int
// ushort actually
val
commandName
:
String
}
internal
object
NullPacketId
:
PacketId
{
override
val
commandId
:
Int
get
()
=
error
(
"uninitialized"
)
override
val
commandName
:
String
get
()
=
error
(
"uninitialized"
)
}
}
\ No newline at end of file
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/SvcReqRegisterPacket.kt
View file @
2e17ea68
...
...
@@ -15,7 +15,7 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.OutgoingPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.PacketFactory
import
net.mamoe.mirai.qqandroid.network.protocol.packet.buildLoginOutgoingPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.oidb.oidb0x769.Oidb0x769
import
net.mamoe.mirai.qqandroid.network.protocol.packet.write
Login
SsoPacket
import
net.mamoe.mirai.qqandroid.network.protocol.packet.writeSsoPacket
import
net.mamoe.mirai.qqandroid.utils.NetworkType
import
net.mamoe.mirai.utils.currentTimeSeconds
import
net.mamoe.mirai.utils.io.debugPrint
...
...
@@ -40,10 +40,10 @@ internal object SvcReqRegisterPacket : PacketFactory<SvcReqRegisterPacket.Respon
internal
object
Response
:
Packet
const
val
subAppId
=
537062845L
private
const
val
subAppId
=
537062845L
init
{
_
id
=
PacketId
(
0
,
"StatSvc.register"
)
_
commandName
=
"StatSvc.register"
}
operator
fun
invoke
(
...
...
@@ -55,8 +55,8 @@ internal object SvcReqRegisterPacket : PacketFactory<SvcReqRegisterPacket.Respon
extraData
=
client
.
wLoginSigInfo
.
d2
.
data
,
key
=
client
.
wLoginSigInfo
.
d2Key
)
{
sequenceId
->
write
Login
SsoPacket
(
client
,
subAppId
=
subAppId
,
packetId
=
id
,
writeSsoPacket
(
client
,
subAppId
=
subAppId
,
commandName
=
commandName
,
extraData
=
client
.
wLoginSigInfo
.
tgt
.
toReadPacket
(),
sequenceId
=
sequenceId
)
{
writeUniRequestPacket
{
...
...
mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/login/TransEmpPacket.kt
View file @
2e17ea68
...
...
@@ -10,7 +10,7 @@ import net.mamoe.mirai.qqandroid.network.protocol.packet.*
internal
object
TransEmpPacket
:
PacketFactory
<
TransEmpPacket
.
Response
>()
{
init
{
_
id
=
PacketId
(
0
x0812
,
"wtlogin.trans_emp"
)
_
commandName
=
"wtlogin.trans_emp"
}
private
const
val
appId
=
16L
...
...
@@ -20,7 +20,7 @@ internal object TransEmpPacket : PacketFactory<TransEmpPacket.Response>() {
fun
SubCommand1
(
client
:
QQAndroidClient
):
OutgoingPacket
=
buildLoginOutgoingPacket
(
client
,
bodyType
=
2
)
{
writeOicqRequestPacket
(
client
,
EncryptMethodECDH135
(
client
.
ecdh
),
id
)
{
writeOicqRequestPacket
(
client
,
EncryptMethodECDH135
(
client
.
ecdh
),
TODO
()
)
{
// oicq.wlogin_sdk.request.trans_emp_1#packTransEmpBody
}
...
...
mirai-core-qqandroid/src/jvmTest/kotlin/androidPacketTests/clientToServer.kt
View file @
2e17ea68
...
...
@@ -22,24 +22,24 @@ import kotlin.text.toByteArray
// x2
// OidbSvc.0xcf8 (getShoppingCardInfo)send 20da22db750806141ef4481108004500009450fd400080060000c0a8030a71600dd0fe501f908b8c3b2908ce927e501801fe436900000000006c0000000b0100014e78000000000e31393934373031303231fde67e3ef90dfab4c8706743671f3abf660fc3f77e4efa3fabdeb96e9984107b3f4bf7677b5d34c72e88a6e212af9107e3c52c5f97b7e41c2c3cecfe9301293ab4be504d4d2eca28a816ec514deca805
// OidbSvc.0x59f send 20da22db750806141ef4481108004500008c50fe400080060000c0a8030a71600dd0fe501f908b8c3b9508ce9366501801fe43610000000000640000000b0100014e7a000000000e313939343730313032319798479335a617d6037b4351bf340716d7095f01a83a19090ced9170a5d2e45578915b186770906f21b623304ee25b7ccb52126e3ab84275d2063f4801b3ea88f4b8fd064be98e75
// OidbSvc.0x59f
(requestIsFirstLogin)
send 20da22db750806141ef4481108004500008c50fe400080060000c0a8030a71600dd0fe501f908b8c3b9508ce9366501801fe43610000000000640000000b0100014e7a000000000e313939343730313032319798479335a617d6037b4351bf340716d7095f01a83a19090ced9170a5d2e45578915b186770906f21b623304ee25b7ccb52126e3ab84275d2063f4801b3ea88f4b8fd064be98e75
// friendlist.GetTroopListReqV2 send 20da22db750806141ef4481108004500011450ff400080060000c0a8030a71600dd0fe501f908b8c3bf908ce963e501801fb43e90000000000ec0000000b0100014e7b000000000e31393934373031303231e92012cde1f02af5088df9ee11e33f90ffc5416dce23cff1193985eb747ea1f453957b000b9f642708e394f590d5c8e7030064ef6f56210330319d4dd4fe21f0463095d74c6d5e21d94fcfb318c58e18d5a83ae548c03827b28c384e9a598f2ec9758ccb313fb825d44b727c10f8929682c5b6d34a8721f06e7ebb6768d39c6e1283b29bbdc15c6f35943fcc26195d1db57ae8de55d96637c7ae4caaa432bcf6768f17a39aa7f49882a86af04876146a2e44c3dcebf3ab106944cf7de19c85111add7b97c8d6bb53f773f11c09525614
// OidbSvc.0x791_0 send 20da22db750806141ef448110800450000bc5101400080060000c0a8030a71600dd0fe501f908b8c3ce508ce96a6501801fa43910000000000940000000b0100014e7d000000000e313939343730313032311ca9030fef4676440544c30ee8455143b3d29bf4b96fcb3923e437c30fd64795a325c777e38cd08f173f5dd6814541ca160a2de1ebdb46dcd73386cbf35ee2faae6cdac5c91aa81cf0beca175d7fdee366bacea06859de8b3e163e95d6765256fc523b7e435dc8f73d1a3f5a5c6c793706c88e103a55efa5
// OidbSvc.0x480_9 send 20da22db750806141ef4481108004500008c5102400080060000c0a8030a71600dd0fe501f908b8c3d7908ce97165018020043610000000000640000000b0100014e7e000000000e3139393437303130323183063dc1abd81bf314960d1a00d2a457ff44cb694c4d17d048b888600262a1a957713055cd6e2a68a55d239e1d70d26f9a39bfc61418a8cfbdd96dac2ae1be32e34f94a0271339d8
// OidbSvc.0x5eb_15 send 20da22db750806141ef4481108004500009c5105400080060000c0a8030a71600dd0fe501f908b8c3ddd08ce9e7e501801fe43710000000000740000000b0100014e7f000000000e31393934373031303231e80e3bc84057f0f3cdbfcde52cf82c5c640f69afd3680638b3bbd86bab49ddb8e29e297815f1f41ddfecfe241f76b57f999b02988fe5bb6f92da0693e27e023baea0504b7ca768c541630e636c31a01bdce3df4c27f88906
// OidbSvc.0x791_0
(getRedPointInfo)
send 20da22db750806141ef448110800450000bc5101400080060000c0a8030a71600dd0fe501f908b8c3ce508ce96a6501801fa43910000000000940000000b0100014e7d000000000e313939343730313032311ca9030fef4676440544c30ee8455143b3d29bf4b96fcb3923e437c30fd64795a325c777e38cd08f173f5dd6814541ca160a2de1ebdb46dcd73386cbf35ee2faae6cdac5c91aa81cf0beca175d7fdee366bacea06859de8b3e163e95d6765256fc523b7e435dc8f73d1a3f5a5c6c793706c88e103a55efa5
// OidbSvc.0x480_9
(getDetailCardInfo)
send 20da22db750806141ef4481108004500008c5102400080060000c0a8030a71600dd0fe501f908b8c3d7908ce97165018020043610000000000640000000b0100014e7e000000000e3139393437303130323183063dc1abd81bf314960d1a00d2a457ff44cb694c4d17d048b888600262a1a957713055cd6e2a68a55d239e1d70d26f9a39bfc61418a8cfbdd96dac2ae1be32e34f94a0271339d8
// OidbSvc.0x5eb_15
(getHiddenSwitch)
send 20da22db750806141ef4481108004500009c5105400080060000c0a8030a71600dd0fe501f908b8c3ddd08ce9e7e501801fe43710000000000740000000b0100014e7f000000000e31393934373031303231e80e3bc84057f0f3cdbfcde52cf82c5c640f69afd3680638b3bbd86bab49ddb8e29e297815f1f41ddfecfe241f76b57f999b02988fe5bb6f92da0693e27e023baea0504b7ca768c541630e636c31a01bdce3df4c27f88906
// CliLogSvc.UploadReq send 20da22db750806141ef448110800450001cc5106400080060000c0a8030a71600dd0fe501f908b8c3e5108ce9eee501801fd44a10000000001a40000000b0100014e80000000000e31393934373031303231393e687d1ca6ee2f38f879c89a930bfbd7a9d0d5d6a84e3e76574b272980e8222c35564db3952d09f452bd954248922527ac9aee51a742b3508d50d3794ce81120245bff0a4e3ac74b026fb5444e9e5a5fad8a5c9865e855ede492fa445cc27e48a27f05d81f39e7f9818890717bffeab38df651f21e884cf5a7292c0f94aa3a849cbfdc84bc7e560e371fbbc4d62c1bd134b41f66915272cee5e4094ef47a5641cdb7e19a070a6babd955a02e722b2a5fbad6adc161f58f295d9a6406dd8bd9ac14bfc520e454eb2f0422ae20beaf6789d25ca367cb22fae28488670f5871e4fa7cd8953eb854a4b53cdd8ef0406f5efbd46870afb095efb7b375f956d4f085b6e03c7f7eada6b35d3cdc6e17c2e0169177f6bc24074f1a5fe90ea54cd8af627a00cb78518e6b7f3daab0811fc0872408581f385d25efeecfa4634998ffa81d43868521467262ff08f7fc338fac60499c3452f530bce46272599401fb4cf363ff74e8813c8e12a51b6bfb992e24d3dcf1dfde34af16e6e892f0a3cf146d2d3e444b62432e5e2932
// CliLogSvc.UploadReq send 20da22db750806141ef448110800450001c45107400080060000c0a8030a71600dd0fe501f908b8c3ff508ce9eee501801fd449900000000019c0000000b0100014e81000000000e3139393437303130323128f6ceffe231f5a913fe9b4c59d24ea84d7dd8a67ef3c802f5eb2705ffeec4e98ddb95ec61e2adb2a52bcf4f744613a956a7af05be228b1dc95d40a0c4e187e79b495946e95bf2ffcabfc550c4f384269f87fea6d550a744a493cc0e11fea05cd7816fcf625b48ee6ed270e13fbacaeaef462a43dd17be5fa587e41e28fa40c083caa7e632cdcdef307404d75c30dce888de061ad715192916ec0b740c5614589b8e06683526042f8b74e896ba1049b71b8deff9354b1b2e83991d7426e2844cc592f511d9d51697361f6ef54370c4043b1bec4d7aa227804dc2b539ef95313b77561faa4d23f7392a2d18f5d796f7768af59d3faa65892169636d9c0e26a7b55be18bcb78719bd0a8ab5fa446f55e515ec5f2d0bfe9e0977ac98fe9af99f0426bc7d65066248d605eefed9b3c42f9d95d578e82515afce2fe239b857619bf64faadee7b10268bd3a079c23a413fffa209fdb9c7d23adab92e4c42fb446add76c24556d2f176f9020183814dfb2fa68861576bfcc41dfdd254d3a63dc8528b95
// OidbSvc.0x787_11 send 20da22db750806141ef448110800450000a45108400080060000c0a8030a71600dd0fe501f908b8c419108ce9eee501801fd437900000000007c0000000b0100014e84000000000e31393934373031303231de7a3d7936e5679df9be661fdb98fa181243fed121a7c37e0a0a035537b27705ed59f5707bf86495d9b4781418f5c8dc36f561d8b659e2936d4549b55ec6c807650b4e5af7c79fe881ee9cb3df4b4b307748103b3b52eef06aeaf81adb25767c
// OidbSvc.0xaf6_0 send 20da22db750806141ef44811080045000094510a400080060000c0a8030a71600dd0fe501f908b8c420d08ce9f86501801fd436900000000006c0000000b0100014e85000000000e313939343730313032311425f3e63a4e0a0454c45b48639abbe10c101b19f0a66f37e774289e87cc3c54def76486925c7291f5d37392120d7e0d30a9caba77f73808b201f49ff2a04a55c5ec502b10a6f861dbffb6eed7324b92
// OidbSvc.0xdc9 send 20da22db750806141ef448110800450000d4510b400080060000c0a8030a71600dd0fe501f908b8c427908cea04e501801fc43a90000000000ac0000000b0100014e86000000000e31393934373031303231abc2f4d9170210b0504e058282363e45527ce2ec6080f48a99d24ca40171ab146ae451517cc60d98585c746d2d00d434d3b44a9e3c9bcbe0a5ee23d406d8ae9c88b9d51beae9d05a3c22fa67f5a03bea60c17017848d32852b7e6abbe290974f74183d7af2b20d6c43c133b52ec2506f9e752676a40518cf73b922505e1e5497fb58146e526627c8fdd2c8ec4424ff96
// OidbSvc.0x787_11
(getTroopMemberListBy0x787)
send 20da22db750806141ef448110800450000a45108400080060000c0a8030a71600dd0fe501f908b8c419108ce9eee501801fd437900000000007c0000000b0100014e84000000000e31393934373031303231de7a3d7936e5679df9be661fdb98fa181243fed121a7c37e0a0a035537b27705ed59f5707bf86495d9b4781418f5c8dc36f561d8b659e2936d4549b55ec6c807650b4e5af7c79fe881ee9cb3df4b4b307748103b3b52eef06aeaf81adb25767c
// OidbSvc.0xaf6_0
(getTroopMemberListForHeadBatch)
send 20da22db750806141ef44811080045000094510a400080060000c0a8030a71600dd0fe501f908b8c420d08ce9f86501801fd436900000000006c0000000b0100014e85000000000e313939343730313032311425f3e63a4e0a0454c45b48639abbe10c101b19f0a66f37e774289e87cc3c54def76486925c7291f5d37392120d7e0d30a9caba77f73808b201f49ff2a04a55c5ec502b10a6f861dbffb6eed7324b92
// OidbSvc.0xdc9
(getHostTroopHonorList)
send 20da22db750806141ef448110800450000d4510b400080060000c0a8030a71600dd0fe501f908b8c427908cea04e501801fc43a90000000000ac0000000b0100014e86000000000e31393934373031303231abc2f4d9170210b0504e058282363e45527ce2ec6080f48a99d24ca40171ab146ae451517cc60d98585c746d2d00d434d3b44a9e3c9bcbe0a5ee23d406d8ae9c88b9d51beae9d05a3c22fa67f5a03bea60c17017848d32852b7e6abbe290974f74183d7af2b20d6c43c133b52ec2506f9e752676a40518cf73b922505e1e5497fb58146e526627c8fdd2c8ec4424ff96
// IncreaseURLSvr.QQHeadUrlReq, IncreaseURLSvr.QQHeadUrlReq send 20da22db750806141ef44811080045000150510c400080060000c0a8030a71600dd0fe501f908b8c432508cea116501801fb44250000000000b40000000b0100014e87000000000e31393934373031303231a3e5c904a29879bfe01d903db3522e51d9d388a6f976387267c78f937ebfb4b800cf847d9af9522bcf8b4e710d905935a904be7e144a8f85db87e784b42bdcc1f19b3dbf307b37d62ba3ee42e6145249161da0a9c608289f139e4f545b9efe40f868a9d7fc06381e59499b04da34e36aac978bb42ad6b93efa55fd63ddc18db1216c68afafc50c954caace2c159cc2ae5cdda25d4bcb5f2b000000740000000b0100014e88000000000e31393934373031303231c571c13b189ca8a129aeecfc734352ff401917c63da218afd73b3f95eaf5121a54331f4ae9534b5c5c5add7307c612fe935cbdfedb775ff1b386adba02b35984aac175015452125c1e93cb333e43c314d53cbb0201ebf0a5
// OidbSvc.0xc42 send 20da22db750806141ef448110800450004ec510d400080060000c0a8030a71600dd0fe501f908b8c444d08cea3ee5018020047c10000000004c40000000b0100014e89000000000e31393934373031303231e59b7a31945585845fec9d893236808c4868e458601b681c89bdefb2b52d4c2b4f3f3d6e6abe0e0e0fc8df28dccc8733c80a4bb9869cfd7203664227c9c485d1e22d02f7fb24944d70542610a73cdb657fb915b1ded3c1a5a52eece81fddbe4df82302b948c88b51bb4fa1bcc9af6302304ffd89ae1fa47f6b732c84c1deb3d4b1bbd6818359f066be51e868d90bd500bb5b3d65ae0cc11a40c3aa03e3aa1e1144dea014d65d1d1ac82cbf6df2415c4b0629bd07323d61f5735bc768d0bbcc7be7fd66ebd9b65232b5491a7c2b33c1079f0af971c0ff178868361cd0fb40b05e3d421145e43a92696ef394f3fbc9e1ac0c037791aa57ad1c6542195c681eb951e7e59532fc9c1eed68c96e79e720d3057f1d6ae4cf4ef253af35fdb2feadec3bac82091d8146a7022b5f2578e3f126a474e9f1cec9d987b055c9217c003931a5cf03530a0062641e6f4549cedf50ea16c75feb7035a849a3229a3663c135cd8905f17176e878fe29942a55107895041595e5b497ca8796d9489d0682e8823589965240ade202ea0efa9f84f1ebc0e25d33e3e81b3a43d7bdc75005fe8b43d09fe914c6af785ba4ad4cb40cb41f5bc622af6dc1cad1460871b8c7fdec63e08a80536ddf340e907b1eddd8fa90d2323d3e2920c7cd80fd379d633e9f8b8c526f47f9e101d6a1edeccaf15d61c893cc55e9c192cd23b7a417c3175461096146a70a08717a8e654086d8db042b674e72dc54a057a80dd7dd291b85af7d4f7ee0b8dabb8a0e58cafb411f1e501b855a2e6ea6b5a089cb8d066d5d9181d0e16d5389123f96a06d630269efe3727ccc2ca84a4b3dbd1f5d786c3a655e2b3e9311bae60acf3855e55b5e96981295193564ab0172ab8fd6fb4a6c05bff477e7800dcfa6d1e6d2face51219e69987a1a03419ce7d6a43b6216f5f3f02d87b8c9e4faf227f4509427f3b26316f3e996a4a9dae90afc693b3eb359ecd2226087305d77bfe3f6fcbb949061f7a4d1076634144fa1b3f2491ca34d75ee4d3c7a4f4ba17233b7e56bcc8c04044ee5c0d0eed5c53814a6efc0347251e47eaf5981bfc5ccc7b3c2c9e6b2d8b5c1b81f2d79d5134420f5909d0526c5d761b94c0afade2dda634f2d44b911b977630dec1c3f7aa0ed1aea422aebb5c6aef49a9873ce5df751bea10926983c43843fa5adc56077f835e84bc07fd434867e4af0d605c64c729baa77e6a22d5b58d4b9378f518b10f57a61a486a815afb0e3591f85b5c5cdb37f5fba5c89b2638b21c27cc369acd6c995932ead6ceb49fdf6122e2c09b385eb43ffbf2e81acb31057beba0700fb388374ce9fb33794b3991e9b3a18123e732b8d14e5aef01391424200dab855c12b47ade4a2c60b760cd9e3c5400d452fa040ead996a21aad6ce6fac722121f35910b39a3cc8e20543fb2539fe3fe538162f086e1de508f0f9b0cc2414b8af6800ece710f944c95031d2536470ca87083a41641392edbf976413844cd7c7d64a6ed61a2f7ce8e09a6948099d62da1f81b28fcb50424f88b1f0a9b271a7172247ff0313e0dff87ef3b2b4d965852d200e0476fb56aba5a71e5e7a2ad500e62e7f15dc165f0a6b315bffde194822420b846fd18ed2f510eb2610d5d23ccaffbded2c495224c0a215859bf03f0cb1ffc7f3373aff418326c2a98c7a44e8bffe93b
// ConfigPushSvc.GetIpDirect send 20da22db750806141ef44811080045000094510e400080060000c0a8030a71600dd0fe501f908b8c491108cea4b6501801ff436900000000006c0000000b0100014e8a000000000e31393934373031303231831dcd7b8023b2e8434f5897e7a34a13b67bcf4def875c650022a4a6b71417d9151938fe206612ae192f55d174e41aa848a02e51441700440260e2fdaf7882cfc60b2a10946dc2e76c172ddefc309389
// * friendlist.getFriendGroupList send 20da22db750806141ef448110800450001245111400080060000c0a8030a71600dd0fe501f908b8c497d08ceae5e501801fd43f90000000000fc0000000b0100014ea4000000000e31393934373031303231899eb2e0bc999ad0799e23cd538fcb600850fda949fd86368e3897c1e1b736ce01509901fc190da6c2c0eb00edd851ebad2efac593997488b51ec58d289d3a050ff1a732a616e3b4fffd40b7aca1da2d04dc0c9e1205bcc63c9473d9ed5b4386cf41d4a786f7382f94266b09db3e3993a27bff4685ffb7d9eda7f66fcf592c8c8d593aa8c00e3fae4274371e5c4b4c3c23bdbc4f6a255d1f5b66f4bf2d56798099afbb34507f516d16ae24b344607bd23c899e241048c18b227a6094cbdcb12d2a8a33b443f7a4f26bc9b3f04fd8001daa46302bdeb22bf32bdc72d06c4a7959
// * StatSvc.GetOnlineStatus send 20da22db750806141ef4481108004500008c5112400080060000c0a8030a71600dd0fe501f908b8c4a7908ceae5e501801fd43610000000000640000000b0100014ea5000000000e31393934373031303231954e34510d4f281e8676c7345c1e8d453c99aeca52c7649053a6230953ac2bca49f6e250394081be6153eceaa531aec179450ec3d671d72251db0c36cff7e1ba3b6de0e6ade53de2
// * account.RequestQueryQQMobileContactsV3 send 20da22db750806141ef448110800450001445115400080060000c0a8030a71600dd0fe501f908b8c4add08ceba36501801ff441900000000011c0000000b0100014ea9000000000e31393934373031303231a78ed17a376177e537dec3ed98b7e47b51e9be299048820b1bf3ae88d8a18324e6773ef89922a7e7cd46f24d18a6f8aa53472bfeb09000bb7c44ef5f646d8a8f9e0d04accb35183b0216bea7dee1ef8a51207f11a0681fbcfcd09364a21b16bd6974fef7d66c7eca43aea623c499f1c81fb995d11d5490e64f7929861b670e2f24dc975684ea3098f0b96aff986b4e0b6b09a45bf7f2e301fa58ba1b462e755685681c112c3d2ac369d785d56c25c12b1c66bf39396030b374400879c922a7c43d6d36cc40aa8482f079ef48355b9a2562669f5bce3d3ace4f014ce0454b158693f2727833d62d29bdc7884b165b93c57e60d443351e9fff7e093494f0c61918
// OidbSvc.0x58a send 20da22db750806141ef448110800450000945116400080060000c0a8030a71600dd0fe501f908b8c4bf908cebb5e501801fe436900000000006c0000000b0100014eaa000000000e3139393437303130323178d1c8e8c5d15a4dca043edc70fa514b19b92706d26a84f2bdb1b3e478d5ef53748b8d6082dea9a74f1c9f0ab519406c1ef36fcc0502cf201f658ecac1cd1682a34bb1ff42ac64da5f35e3af7fabcc8c
// OidbSvc.0x58a
(getDiscuss)
send 20da22db750806141ef448110800450000945116400080060000c0a8030a71600dd0fe501f908b8c4bf908cebb5e501801fe436900000000006c0000000b0100014eaa000000000e3139393437303130323178d1c8e8c5d15a4dca043edc70fa514b19b92706d26a84f2bdb1b3e478d5ef53748b8d6082dea9a74f1c9f0ab519406c1ef36fcc0502cf201f658ecac1cd1682a34bb1ff42ac64da5f35e3af7fabcc8c
// OidbSvc.0x7c4_0, OidbSvc.0xbe8 send 20da22db750806141ef448110800450001085117400080060000c0a8030a71600dd0fe501f908b8c4c6508cebbe6501801fe43dd00000000006c0000000b0100014eab000000000e31393934373031303231a047827363fff4e4596299c74f6d847be9e8b5c2e4327bdaddffb8dd40e8df0eb76c54a6c7b7a56eddbae7136bb2b076386eb3b51091c46e756d1f9241678b656498da02276578cfb1ebfb6445513f51000000740000000b0100014eac000000000e31393934373031303231bd70b59f03df1144ae0ab45768257763ae622d5517bc20092fffaf4a5a3d55118ef6cd02907467c0eaa4a45309661277166f75e8ec4b75c0ec5fbf313e03b4a667ce26dfb0d148039a4d9ef8be7ad8cdf5e5a810edb60dd4
// OidbSvc.0x58b_0, CertifiedAccountSvc.certified_account_read.GetFollowList send 20da22db750806141ef448110800450002f05118400080060000c0a8030a71600dd0fe501f908b8c4d4508cebcd6501801fd45c500000000009c0000000b0100014ead000000000e313939343730313032311c087c0ad4a44631d3e9eb9a6ebb4456a003db2e7eaa5e27ffd4c3ee592b8de7b89b9f6a56fc8260e57eef4f3b6616a5255ab830548dd50e9a99cf87011584f3811591c35fc95cadfc364bbeb0ed337063a518aca85fd17c30ab57408389f5c071ed2626ec47b1086478164d0ae0bd0f21222eb7d4b7a5601bc160f99a8f70330000022c0000000b0100014eae000000000e313939343730313032312dd572fad1b71384d3fdb16a1c57f3cbadac7e41ae6de9d13cc2827262e4c5a4bb95829233b72b5f9076b4652c1ffd1ebba874003bcf7e3be86cdc1034ac656efde24be90a49484209c954b78dec531b3d194cc92a297efef340d8273de90a63335bf543109e96a5aa958283161e7e78f50b74b49adb176472ac82fdad36adb68b38421deba0d1c1dcf24f8342bb8d39c1181545a675abb92a3e28431e60a02aaca6c2b4f5ea79c3f4431865444932c9af983f07dd39dd6d81e47f0f59e386e5320051472fe9235f3b98b8850a9335074173730103565ddf81fb57fedb200f328d9ba16d2e52ecf1cc590382087529678501b1ab6b5866afb25b70f0d03b0773f84691e6b94e6d03c3c47f1baa4e17552fafce1bcc90e336ae0d7fca76babcb035378ce191aee9315885197a39301f319857c33cd25a017f6a0480e16030b623547216bafe886f41014f65ae2e6cf3b4c58a4ce96b8f0967c4b0e0be6a9e669c25a06e6b412f115522522af613c6b8fee922d4f3f189d3c2696521afd63fdfc4103bd827a3eb4aba949a6e07424510af29c74e3de4faa1706bf128ac7f9f66306852da2390bb6cb8ed34c885b49d577e22b86222e95142b351dec31690804b98d98baa66b405cb6d649069d9e21254f2f81a6963962955c86e6a74be6c159eb9dce9eff7eb7e0c34f864d826ececbc1e577b4498b403140983fd716ca2b04aa5c23b8c18fe28367bc5ba76081c4aafd3
// CertifiedAccountSvc.certified_account_read.GetFollowList send 20da22db750806141ef44811080045000274511c400080060000c0a8030a71600dd0fe501f908b8c500d08ceca66501801ff454900000000024c0000000b0100014eaf000000000e313939343730313032318b6198dc33ae901346ecbe82c9821a5e2e7e68d070b2baa3dc8525246a625cb7461bf329a93acc9d20b0221108cd838505d2c0e2c9b944cf7c57eb17b74e74c99c873febfc6e89395b139c033c68d66b731b0ad4d9d7444471b7638628924c3ebb4c2ed326a87b1761d5d5a72043c5e3e538d5797843333867177b5f52445e0b5fa5805cba497e5f0f7da203da3504d74977180e1b86dcdb0c3b7298c4b10d6e53a145c277033e20445a82d0fcc78a1ce597294bf767e43ca42608e7531577d185cc14f91db8f3b71b614f5299ab75c448dd7462a0ce66b1a0992db05ebbab6667ca79ff39d2e9e5f58f73eb2b47cf1896e5560ebe389289b2222687ea8af254b4518ccc6d3468dd03ebce6247e7aac4278ba99210b4c91c49c6f29fd3ecb2653eae174e7bddaf40ef743f8da7605d09d36bca5ef84ee9b75d126db616fbe2b67cdbbb26809d56e97b2e4f6175da52694f0ee640ea1990dc79e5a0c2b266ddc16d0b7bf19818ad7727add2fd2ab379ba1b41763d953d0e21dd26e2f469e8273059f5130355a0976d5a01ca438f3b698b96a2c5394b6ebe381b3818b032ee5226a1a246935a741d39fb84feb917f9680d6c7b2e950e74def6523c318cbbe592904167f2ff8dbaf10616fb2b39a5af68fa19443e874ad2a6bc0639240903fccf8d2eecaacb9404c15ec387faf459f438c229e4a571234403078d270499a2634b13baf5051979ebe31ec8fedb55854e73d58534e51a924c637ee797389de4a27da494dbe7b50c69e1c4857537d3f369752e
...
...
@@ -49,29 +49,27 @@ import kotlin.text.toByteArray
// ConfigPushSvc.PushResp, ** StatSvc.register send 20da22db750806141ef448110800450002f85124400080060000c0a8030a71600dd0fe501f908b8c558508cee2605018020045cd0000000000ac0000000b01a4da6eb0000000000e3139393437303130323122465f76192ce454d64e90a36fe651eb96d052893396c002a815851dc04994d16f7a596b06ca02b4743077fb387442f00409806ece8bf2f533a129073db60c8d5a22b9d4224387629e8ce29959a683f505b741aa1a83068239f6df0f97a4e5499c1035092e7466b005307110460211aecd1f11c10cea0cc861007e08882accb0bbaec68cd9c9a83fd19bb5eebda016ff000002240000000a0100000044e0e22a59327abb9ce80cf63be86694210344fab2f2b065d7785a32cacfa4075cd509f49cb37a075ad0685cbd472344bfdef1ede611c0ad81129be9e2d7e476d2000000000e31393934373031303231f4cf6ac405adbbfab64c0905f9f1f4b3236e4b17c34bc8aaefd77b184f012c036978eea06bb7f9e6d443a9d71f6eaf8b08b3c49858269de0405d7acf5076fd3000357cdbced53142200fcd8f87dc2a047ecfdd0d374aa0bb1b5c97b35e59a7cc77f146c930d04be6b70a75be3d71704d1b95794cbc36ef0ffe96533d61521c7b4b676f6b067859c0760ae5689f146b3c1a19668b694a50aa1d561f2feb76b49d507dc530d49007ba08f84297b23290177539d0b2a3ceb0a2ef8a64b65494e574ed78857fc1c93911c7639dce6699d5fde605f432d4ab7dfd6cf8cc5451950b29d79f5e755f90faadf55dfcb3993d9b4fb9479f44e47c1a0702205da298327b0deb180e2976d07be7b6ac0302b128d792200a092e084ca6908fe0c13e142d50f42783009029b3d2da23bd1050a2cc56023f943ce3b164002fa31fdf9624a255455cc77b774223726f36cccb2603240ca528534ee1533eb66872b007ea20bb5e76f87efa35d7dcb4be7e5f410ed7276c09e20f04db63ea4b79fd7d2201ef0ec14b5f9795bd2bd028e58b3ab8d3461a188f113a8b50406e9c3db9f8b2115924faadc9f2707c6715dc2dda73119228079467fbe145cf951cf1948e755aa428f4e478a6ab9708ad39ded4
private
val
wtSessionTicketKey
=
"B6 9D E4 EC 65 38 64 FD C8 3A D8 33 54 35 0C 73"
.
hexToBytes
()
private
val
tgtgtKey
=
"D7 71 03 E3 4C E5 8F 6B 05 D8 C7 8C 96 FB FB 23"
.
hexToBytes
()
private
val
deviceToken
=
"CE 1E 2E DC 69 24 4F 9B FF 2F 52 D8 8F 69 DD 40"
.
hexToBytes
()
private
val
D2Key
=
"44 28 6B 35 7A 54 2D 45 45 5D 56 32 44 33 47 49"
.
hexToBytes
()
private
val
userStKey
=
"35 29 42 54 78 62 47 68 5E 77 68 54 6B 76 57 5F"
.
hexToBytes
()
private
val
userStWebSig
=
internal
val
wtSessionTicketKey
=
"B6 9D E4 EC 65 38 64 FD C8 3A D8 33 54 35 0C 73"
.
hexToBytes
()
internal
val
tgtgtKey
=
"D7 71 03 E3 4C E5 8F 6B 05 D8 C7 8C 96 FB FB 23"
.
hexToBytes
()
internal
val
deviceToken
=
"CE 1E 2E DC 69 24 4F 9B FF 2F 52 D8 8F 69 DD 40"
.
hexToBytes
()
internal
val
D2Key
=
"44 28 6B 35 7A 54 2D 45 45 5D 56 32 44 33 47 49"
.
hexToBytes
()
internal
val
userStKey
=
"35 29 42 54 78 62 47 68 5E 77 68 54 6B 76 57 5F"
.
hexToBytes
()
internal
val
userStWebSig
=
"63 A2 BD 78 FC 88 58 AC 12 95 6C 15 6A 9B A1 EB B0 E8 66 D0 95 D2 0E B4 BC C3 48 05 C1 D9 54 FB 65 8F 21 29 E5 5D 84 BA A1 63 48 5C 24 F3 84 A3"
.
hexToBytes
()
private
val
tgtKey
=
"44 24 3F 43 3F 21 37 2B 29 44 6E 47 70 3A 4E 3D"
.
hexToBytes
()
internal
val
tgtKey
=
"44 24 3F 43 3F 21 37 2B 29 44 6E 47 70 3A 4E 3D"
.
hexToBytes
()
private
val
t108
=
"BD 12 96 6C 83 53 EF DD 06 16 52 16 B8 1B 25 69"
.
hexToBytes
()
private
val
t10c
=
"23 7D 2C 7A 3F 4A 41 35 7D 3B 45 51 6D 3D 2A 56"
.
hexToBytes
()
private
val
t163
=
"2C 7A 7B 23 4E 24 3F 24 24 47 62 6B 69 2E 47 50"
.
hexToBytes
()
internal
val
t108
=
"BD 12 96 6C 83 53 EF DD 06 16 52 16 B8 1B 25 69"
.
hexToBytes
()
internal
val
t10c
=
"23 7D 2C 7A 3F 4A 41 35 7D 3B 45 51 6D 3D 2A 56"
.
hexToBytes
()
internal
val
t163
=
"2C 7A 7B 23 4E 24 3F 24 24 47 62 6B 69 2E 47 50"
.
hexToBytes
()
private
val
shareKeyCalculatedByConstPubKey
=
ECDH
.
calculateShareKey
(
internal
val
shareKeyCalculatedByConstPubKey
=
ECDH
.
calculateShareKey
(
loadPrivateKey
(
"97a52992cb7a2110413629af94a3c249c68a3b731510caa8"
),
initialPublicKey
)
fun
main
()
{
val
data
=
"""
20da22db750806141ef44811080045000
0d4512f400080060000c0a8030a71600dd0fe501f908b8c5c9908cf2416501801ff43a90000000000ac0000000b0100014f0d000000000e3139393437303130323193c94c8ce2871f6d5f6664df9e9231dedce5c7cb914cf5d616cf64af478aea9f210098e7f5efae9a952742b8fff704681885e5cc14a44e40d88910258f4a4a5cfcadd642cc159fdc475478475b18ba225cfad1c8bc2c5c828a9cc3ebaed1aa040d04b94f577fcfdb0861fd19754622733a242c5bcb37ca8597a2935d9910162111e44839b6787bb9be80058ad9c921c2
20da22db750806141ef44811080045000
2f85124400080060000c0a8030a71600dd0fe501f908b8c558508cee2605018020045cd0000000000ac0000000b01a4da6eb0000000000e3139393437303130323122465f76192ce454d64e90a36fe651eb96d052893396c002a815851dc04994d16f7a596b06ca02b4743077fb387442f00409806ece8bf2f533a129073db60c8d5a22b9d4224387629e8ce29959a683f505b741aa1a83068239f6df0f97a4e5499c1035092e7466b005307110460211aecd1f11c10cea0cc861007e08882accb0bbaec68cd9c9a83fd19bb5eebda016ff000002240000000a0100000044e0e22a59327abb9ce80cf63be86694210344fab2f2b065d7785a32cacfa4075cd509f49cb37a075ad0685cbd472344bfdef1ede611c0ad81129be9e2d7e476d2000000000e31393934373031303231f4cf6ac405adbbfab64c0905f9f1f4b3236e4b17c34bc8aaefd77b184f012c036978eea06bb7f9e6d443a9d71f6eaf8b08b3c49858269de0405d7acf5076fd3000357cdbced53142200fcd8f87dc2a047ecfdd0d374aa0bb1b5c97b35e59a7cc77f146c930d04be6b70a75be3d71704d1b95794cbc36ef0ffe96533d61521c7b4b676f6b067859c0760ae5689f146b3c1a19668b694a50aa1d561f2feb76b49d507dc530d49007ba08f84297b23290177539d0b2a3ceb0a2ef8a64b65494e574ed78857fc1c93911c7639dce6699d5fde605f432d4ab7dfd6cf8cc5451950b29d79f5e755f90faadf55dfcb3993d9b4fb9479f44e47c1a0702205da298327b0deb180e2976d07be7b6ac0302b128d792200a092e084ca6908fe0c13e142d50f42783009029b3d2da23bd1050a2cc56023f943ce3b164002fa31fdf9624a255455cc77b774223726f36cccb2603240ca528534ee1533eb66872b007ea20bb5e76f87efa35d7dcb4be7e5f410ed7276c09e20f04db63ea4b79fd7d2201ef0ec14b5f9795bd2bd028e58b3ab8d3461a188f113a8b50406e9c3db9f8b2115924faadc9f2707c6715dc2dda73119228079467fbe145cf951cf1948e755aa428f4e478a6ab9708ad39ded4
"""
.
trimIndent
()
...
...
@@ -101,12 +99,11 @@ fun ByteReadPacket.analysisOneFullPacket() = debugIfFail("Failed", { buildPacket
val
flag1
=
readInt
()
println
(
"flag1="
+
flag1
.
contentToString
())
val
flag2
=
readByte
().
toInt
()
println
(
"flag2=$flag2"
)
if
(
flag1
==
0
x0B
)
{
if
(
flag2
==
1
)
{
println
(
"flag2=$flag2"
)
println
(
"sequenceId = "
+
readInt
().
toUHexString
())
}
else
{
println
(
"flag2=$flag2"
)
println
(
"extra data="
+
readBytes
(
readInt
()
-
4
).
toUHexString
())
}
}
else
{
...
...
@@ -124,9 +121,9 @@ fun ByteReadPacket.analysisOneFullPacket() = debugIfFail("Failed", { buildPacket
println
(
"// 解密 body"
)
readRemainingBytes
().
tryDecrypt
().
toReadPacket
().
debugPrint
(
"outer body decrypted"
).
apply
{
when
(
flag
2
)
{
2
->
decodeSso
()
1
->
decodeUni
()
when
(
flag
1
)
{
0
x0A
->
decodeSso
()
0
x0B
->
decodeUni
()
}
}
}
...
...
@@ -139,7 +136,7 @@ fun ByteReadPacket.decodeUni() {
// 00 00 00 5B 10 03 2C 3C 4C 56 23 51 51 53 65 72 76 69 63 65 2E 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 4D 61 69 6E 53 65 72 76 61 6E 74 66 08 50 75 73 68 52 65 73 70 7D 00 00 1A 08 00 01 06 08 50 75 73 68 52 65 73 70 1D 00 00 09 0A 10 01 22 14 DA 6E B1 0B 8C 98 0C A8 0C
println
(
"// 尝试解 Uni"
)
println
(
"// head"
)
readBytes
(
readInt
()
-
4
).
read
{
readBytes
(
readInt
()
-
4
).
debugPrint
(
"head"
).
toReadPacket
().
apply
{
val
commandName
=
readString
(
readInt
()
-
4
).
also
{
println
(
"commandName=$it"
)
}
println
(
" unknown4Bytes="
+
readBytes
(
readInt
()
-
4
).
toUHexString
())
// 00 00 00 1A 43 6F 6E 66 69 67 50 75 73 68 53 76 63 2E 50 75 73 68 52 65 73 70
...
...
mirai-debug/build.gradle.kts
View file @
2e17ea68
...
...
@@ -41,8 +41,11 @@ fun ktor(id: String, version: String) = "io.ktor:ktor-$id:$version"
dependencies
{
runtimeOnly
(
files
(
"../mirai-core/build/classes/kotlin/jvm/main"
))
// IDE bug
runtimeOnly
(
files
(
"../mirai-core-timpc/build/classes/kotlin/jvm/main"
))
// IDE bug
implementation
(
project
(
":mirai-core-timpc"
))
runtimeOnly
(
files
(
"../mirai-core-qqandroid/build/classes/kotlin/jvm/main"
))
// IDE bug
implementation
(
project
(
":mirai-core-qqandroid"
))
// runtimeOnly(files("../mirai-core/build/classes/kotlin/jvm/main")) // classpath is not added correctly by IDE
implementation
(
"org.bouncycastle:bcprov-jdk15on:1.64"
)
...
...
@@ -70,4 +73,9 @@ dependencies {
implementation
(
ktor
(
"client-core"
,
ktorVersion
))
implementation
(
ktor
(
"network"
,
ktorVersion
))
testImplementation
(
kotlin
(
"test-annotations-common"
))
testImplementation
(
kotlin
(
"test"
))
testImplementation
(
kotlin
(
"test-junit"
))
testImplementation
(
kotlin
(
"script-runtime"
))
}
\ No newline at end of file
mirai-debug/src/test/java/jce/jce/HexUtil.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
import
java.io.UnsupportedEncodingException
;
public
class
HexUtil
{
private
static
final
char
[]
digits
=
new
char
[]{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
};
public
static
final
byte
[]
emptybytes
=
new
byte
[
0
];
public
static
String
byte2HexStr
(
byte
var0
)
{
char
var1
=
digits
[
var0
&
15
];
var0
=
(
byte
)
(
var0
>>>
4
);
return
new
String
(
new
char
[]{
digits
[
var0
&
15
],
var1
});
}
public
static
String
bytes2HexStr
(
byte
[]
var0
)
{
if
(
var0
!=
null
&&
var0
.
length
!=
0
)
{
char
[]
var3
=
new
char
[
var0
.
length
*
2
];
for
(
int
var1
=
0
;
var1
<
var0
.
length
;
++
var1
)
{
byte
var2
=
var0
[
var1
];
var3
[
var1
*
2
+
1
]
=
digits
[
var2
&
15
];
var2
=
(
byte
)
(
var2
>>>
4
);
var3
[
var1
*
2
+
0
]
=
digits
[
var2
&
15
];
}
return
new
String
(
var3
);
}
else
{
return
null
;
}
}
public
static
byte
char2Byte
(
char
var0
)
{
if
(
var0
>=
'0'
&&
var0
<=
'9'
)
{
return
(
byte
)
(
var0
-
48
);
}
else
if
(
var0
>=
'a'
&&
var0
<=
'f'
)
{
return
(
byte
)
(
var0
-
97
+
10
);
}
else
{
return
var0
>=
'A'
&&
var0
<=
'F'
?
(
byte
)
(
var0
-
65
+
10
)
:
0
;
}
}
public
static
byte
hexStr2Byte
(
String
var0
)
{
byte
var2
=
0
;
byte
var1
=
var2
;
if
(
var0
!=
null
)
{
var1
=
var2
;
if
(
var0
.
length
()
==
1
)
{
var1
=
char2Byte
(
var0
.
charAt
(
0
));
}
}
return
var1
;
}
public
static
byte
[]
hexStr2Bytes
(
String
var0
)
{
if
(
var0
!=
null
&&
!
var0
.
equals
(
""
))
{
byte
[]
var4
=
new
byte
[
var0
.
length
()
/
2
];
for
(
int
var3
=
0
;
var3
<
var4
.
length
;
++
var3
)
{
char
var1
=
var0
.
charAt
(
var3
*
2
);
char
var2
=
var0
.
charAt
(
var3
*
2
+
1
);
var4
[
var3
]
=
(
byte
)
(
char2Byte
(
var1
)
*
16
+
char2Byte
(
var2
));
}
return
var4
;
}
else
{
return
emptybytes
;
}
}
public
static
void
main
(
String
[]
var0
)
{
try
{
byte
[]
var2
=
"Hello WebSocket World?"
.
getBytes
(
"gbk"
);
System
.
out
.
println
(
bytes2HexStr
(
var2
));
}
catch
(
UnsupportedEncodingException
var1
)
{
var1
.
printStackTrace
();
}
}
}
mirai-debug/src/test/java/jce/jce/JceDecodeException.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
public
class
JceDecodeException
extends
RuntimeException
{
public
JceDecodeException
(
String
var1
)
{
super
(
var1
);
}
}
mirai-debug/src/test/java/jce/jce/JceEncodeException.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
public
class
JceEncodeException
extends
RuntimeException
{
public
JceEncodeException
(
String
var1
)
{
super
(
var1
);
}
}
mirai-debug/src/test/java/jce/jce/JceInputStream$HeadData.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
public
class
JceInputStream
$HeadData
{
public
int
tag
;
public
byte
type
;
public
void
clear
()
{
this
.
type
=
0
;
this
.
tag
=
0
;
}
}
mirai-debug/src/test/java/jce/jce/JceInputStream.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
import
java.io.UnsupportedEncodingException
;
import
java.lang.reflect.Array
;
import
java.nio.BufferUnderflowException
;
import
java.nio.ByteBuffer
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map.Entry
;
public
final
class
JceInputStream
{
// $FF: renamed from: bs java.nio.ByteBuffer
private
ByteBuffer
buffer
;
protected
String
sServerEncoding
=
"GBK"
;
public
JceInputStream
()
{
}
public
JceInputStream
(
ByteBuffer
var1
)
{
this
.
buffer
=
var1
;
}
public
JceInputStream
(
byte
[]
var1
)
{
this
.
buffer
=
ByteBuffer
.
wrap
(
var1
);
}
public
JceInputStream
(
byte
[]
var1
,
int
var2
)
{
this
.
buffer
=
ByteBuffer
.
wrap
(
var1
);
this
.
buffer
.
position
(
var2
);
}
public
static
void
main
(
String
[]
var0
)
{
}
private
int
peakHead
(
JceInputStream
$HeadData
var1
)
{
return
readHead
(
var1
,
this
.
buffer
.
duplicate
());
}
private
<
T
>
T
[]
readArrayImpl
(
T
var1
,
int
var2
,
boolean
var3
)
{
Object
[]
var7
;
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var5
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var5
);
if
(
var5
.
type
==
9
)
{
int
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var4
);
}
else
{
Object
[]
var6
=
(
Object
[])
Array
.
newInstance
(
var1
.
getClass
(),
var4
);
var2
=
0
;
while
(
true
)
{
var7
=
var6
;
if
(
var2
>=
var4
)
{
return
(
T
[])
var7
;
}
var6
[
var2
]
=
this
.
read
(
var1
,
0
,
true
);
++
var2
;
}
}
}
throw
new
JceDecodeException
(
"type mismatch."
);
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
var7
=
null
;
return
(
T
[])
var7
;
}
}
public
static
int
readHead
(
JceInputStream
$HeadData
var0
,
ByteBuffer
var1
)
{
byte
var2
=
var1
.
get
();
var0
.
type
=
(
byte
)
(
var2
&
15
);
var0
.
tag
=
(
var2
&
240
)
>>
4
;
if
(
var0
.
tag
==
15
)
{
var0
.
tag
=
var1
.
get
()
&
255
;
return
2
;
}
else
{
return
1
;
}
}
private
<
K
,
V
>
Map
<
K
,
V
>
readMap
(
Map
<
K
,
V
>
var1
,
Map
<
K
,
V
>
var2
,
int
var3
,
boolean
var4
)
{
Map
<
K
,
V
>
var8
;
if
(
var2
!=
null
&&
!
var2
.
isEmpty
())
{
Entry
<
K
,
V
>
var9
=
var2
.
entrySet
().
iterator
().
next
();
K
var6
=
var9
.
getKey
();
V
var7
=
var9
.
getValue
();
if
(
this
.
skipToTag
(
var3
))
{
JceInputStream
$HeadData
var10
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var10
);
if
(
var10
.
type
==
8
)
{
int
var5
=
this
.
read
(
0
,
0
,
true
);
if
(
var5
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var5
);
}
var3
=
0
;
while
(
true
)
{
var8
=
var1
;
if
(
var3
>=
var5
)
{
return
var8
;
}
var1
.
put
((
K
)
this
.
read
(
var6
,
0
,
true
),
(
V
)
this
.
read
(
var7
,
1
,
true
));
++
var3
;
}
}
throw
new
JceDecodeException
(
"type mismatch."
);
}
else
{
var8
=
var1
;
if
(
var4
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
}
}
else
{
var8
=
new
HashMap
<>();
}
return
var8
;
}
private
void
skip
(
int
var1
)
{
this
.
buffer
.
position
(
this
.
buffer
.
position
()
+
var1
);
}
private
void
skipField
()
{
JceInputStream
$HeadData
var1
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var1
);
this
.
skipField
(
var1
.
type
);
}
private
void
skipField
(
byte
var1
)
{
byte
var3
=
0
;
byte
var2
=
0
;
int
var5
;
switch
(
var1
)
{
case
0
:
this
.
skip
(
1
);
break
;
case
1
:
this
.
skip
(
2
);
return
;
case
2
:
this
.
skip
(
4
);
return
;
case
3
:
this
.
skip
(
8
);
return
;
case
4
:
this
.
skip
(
4
);
return
;
case
5
:
this
.
skip
(
8
);
return
;
case
6
:
byte
var7
=
this
.
buffer
.
get
();
var5
=
var7
;
if
(
var7
<
0
)
{
var5
=
var7
+
256
;
}
this
.
skip
(
var5
);
return
;
case
7
:
this
.
skip
(
this
.
buffer
.
getInt
());
return
;
case
8
:
int
var8
=
this
.
read
(
0
,
0
,
true
);
for
(
var5
=
var2
;
var5
<
var8
*
2
;
++
var5
)
{
this
.
skipField
();
}
return
;
case
9
:
int
var6
=
this
.
read
(
0
,
0
,
true
);
for
(
var5
=
var3
;
var5
<
var6
;
++
var5
)
{
this
.
skipField
();
}
return
;
case
10
:
this
.
skipToStructEnd
();
return
;
case
11
:
case
12
:
break
;
case
13
:
JceInputStream
$HeadData
var4
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var4
);
if
(
var4
.
type
!=
0
)
{
throw
new
JceDecodeException
(
"skipField with invalid type, type value: "
+
var1
+
", "
+
var4
.
type
);
}
this
.
skip
(
this
.
read
(
0
,
0
,
true
));
return
;
default
:
throw
new
JceDecodeException
(
"invalid type."
);
}
}
public
JceStruct
directRead
(
JceStruct
var1
,
int
var2
,
boolean
var3
)
{
JceInputStream
$HeadData
var4
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
try
{
var1
=
var1
.
newInit
();
}
catch
(
Exception
var5
)
{
throw
new
JceDecodeException
(
var5
.
getMessage
());
}
var4
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var4
);
if
(
var4
.
type
!=
10
)
{
throw
new
JceDecodeException
(
"type mismatch."
);
}
var1
.
readFrom
(
this
);
this
.
skipToStructEnd
();
}
else
{
var1
=
null
;
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
}
return
var1
;
}
public
ByteBuffer
getBs
()
{
return
this
.
buffer
;
}
public
byte
read
(
byte
var1
,
int
var2
,
boolean
var3
)
{
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var4
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var4
);
switch
(
var4
.
type
)
{
case
0
:
return
this
.
buffer
.
get
();
case
12
:
return
0
;
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
double
read
(
double
var1
,
int
var3
,
boolean
var4
)
{
if
(
this
.
skipToTag
(
var3
))
{
JceInputStream
$HeadData
var5
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var5
);
switch
(
var5
.
type
)
{
case
4
:
return
this
.
buffer
.
getFloat
();
case
5
:
return
this
.
buffer
.
getDouble
();
case
12
:
return
0.0
D
;
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var4
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
float
read
(
float
var1
,
int
var2
,
boolean
var3
)
{
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var4
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var4
);
switch
(
var4
.
type
)
{
case
4
:
return
this
.
buffer
.
getFloat
();
case
12
:
return
0.0
F
;
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
int
read
(
int
var1
,
int
var2
,
boolean
var3
)
{
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var4
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var4
);
switch
(
var4
.
type
)
{
case
0
:
return
this
.
buffer
.
get
();
case
1
:
return
this
.
buffer
.
getShort
();
case
2
:
return
this
.
buffer
.
getInt
();
case
12
:
return
0
;
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
long
read
(
long
var1
,
int
var3
,
boolean
var4
)
{
if
(
this
.
skipToTag
(
var3
))
{
JceInputStream
$HeadData
var5
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var5
);
switch
(
var5
.
type
)
{
case
0
:
return
this
.
buffer
.
get
();
case
1
:
return
this
.
buffer
.
getShort
();
case
2
:
return
this
.
buffer
.
getInt
();
case
3
:
return
this
.
buffer
.
getLong
();
case
12
:
return
0L
;
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var4
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
JceStruct
read
(
JceStruct
var1
,
int
var2
,
boolean
var3
)
{
JceInputStream
$HeadData
var4
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
try
{
var1
=
var1
.
getClass
().
newInstance
();
}
catch
(
Exception
var5
)
{
throw
new
JceDecodeException
(
var5
.
getMessage
());
}
var4
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var4
);
if
(
var4
.
type
!=
10
)
{
throw
new
JceDecodeException
(
"type mismatch."
);
}
var1
.
readFrom
(
this
);
this
.
skipToStructEnd
();
}
else
{
var1
=
null
;
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
}
return
var1
;
}
public
<
T
>
Object
read
(
T
var1
,
int
var2
,
boolean
var3
)
{
if
(
var1
instanceof
Byte
)
{
return
this
.
read
((
byte
)
0
,
var2
,
var3
);
}
else
if
(
var1
instanceof
Boolean
)
{
return
this
.
read
(
false
,
var2
,
var3
);
}
else
if
(
var1
instanceof
Short
)
{
return
this
.
read
((
short
)
0
,
var2
,
var3
);
}
else
if
(
var1
instanceof
Integer
)
{
return
this
.
read
(
0
,
var2
,
var3
);
}
else
if
(
var1
instanceof
Long
)
{
return
this
.
read
(
0L
,
var2
,
var3
);
}
else
if
(
var1
instanceof
Float
)
{
return
this
.
read
(
0.0
F
,
var2
,
var3
);
}
else
if
(
var1
instanceof
Double
)
{
return
this
.
read
(
0.0
D
,
var2
,
var3
);
}
else
if
(
var1
instanceof
String
)
{
return
this
.
readString
(
var2
,
var3
);
}
else
if
(
var1
instanceof
Map
)
{
return
this
.
readMap
((
Map
)
var1
,
var2
,
var3
);
}
else
if
(
var1
instanceof
List
)
{
return
this
.
readArray
((
List
)
var1
,
var2
,
var3
);
}
else
if
(
var1
instanceof
JceStruct
)
{
return
this
.
read
((
JceStruct
)
var1
,
var2
,
var3
);
}
else
if
(
var1
.
getClass
().
isArray
())
{
if
(!(
var1
instanceof
byte
[])
&&
!(
var1
instanceof
Byte
[]))
{
if
(
var1
instanceof
boolean
[])
{
return
this
.
read
((
boolean
[])
null
,
var2
,
var3
);
}
else
if
(
var1
instanceof
short
[])
{
return
this
.
read
((
short
[])
null
,
var2
,
var3
);
}
else
if
(
var1
instanceof
int
[])
{
return
this
.
read
((
int
[])
null
,
var2
,
var3
);
}
else
if
(
var1
instanceof
long
[])
{
return
this
.
read
((
long
[])
null
,
var2
,
var3
);
}
else
if
(
var1
instanceof
float
[])
{
return
this
.
read
((
float
[])
null
,
var2
,
var3
);
}
else
{
return
var1
instanceof
double
[]
?
this
.
read
((
double
[])
null
,
var2
,
var3
)
:
this
.
readArray
((
Object
[])
var1
,
var2
,
var3
);
}
}
else
{
return
this
.
read
((
byte
[])
null
,
var2
,
var3
);
}
}
else
{
throw
new
JceDecodeException
(
"read object error: unsupport type."
);
}
}
public
String
read
(
String
var1
,
int
var2
,
boolean
var3
)
{
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var8
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var8
);
String
var5
;
byte
[]
var9
;
switch
(
var8
.
type
)
{
case
6
:
byte
var4
=
this
.
buffer
.
get
();
var2
=
var4
;
if
(
var4
<
0
)
{
var2
=
var4
+
256
;
}
var9
=
new
byte
[
var2
];
this
.
buffer
.
get
(
var9
);
try
{
var5
=
new
String
(
var9
,
this
.
sServerEncoding
);
return
var5
;
}
catch
(
UnsupportedEncodingException
var7
)
{
return
new
String
(
var9
);
}
case
7
:
var2
=
this
.
buffer
.
getInt
();
if
(
var2
<=
104857600
&&
var2
>=
0
&&
var2
<=
this
.
buffer
.
capacity
())
{
var9
=
new
byte
[
var2
];
this
.
buffer
.
get
(
var9
);
try
{
var5
=
new
String
(
var9
,
this
.
sServerEncoding
);
return
var5
;
}
catch
(
UnsupportedEncodingException
var6
)
{
return
new
String
(
var9
);
}
}
throw
new
JceDecodeException
(
"String too long: "
+
var2
);
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
short
read
(
short
var1
,
int
var2
,
boolean
var3
)
{
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var4
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var4
);
switch
(
var4
.
type
)
{
case
0
:
return
this
.
buffer
.
get
();
case
1
:
return
this
.
buffer
.
getShort
();
case
12
:
return
0
;
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
boolean
read
(
boolean
var1
,
int
var2
,
boolean
var3
)
{
var1
=
this
.
read
((
byte
)
0
,
var2
,
var3
)
!=
0
;
return
var1
;
}
public
byte
[]
read
(
byte
[]
var1
,
int
var2
,
boolean
var3
)
{
var1
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var6
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var6
);
int
var4
;
switch
(
var6
.
type
)
{
case
9
:
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
>=
0
&&
var4
<=
this
.
buffer
.
capacity
())
{
byte
[]
var7
=
new
byte
[
var4
];
var2
=
0
;
while
(
true
)
{
var1
=
var7
;
if
(
var2
>=
var4
)
{
return
var1
;
}
var7
[
var2
]
=
this
.
read
(
var7
[
0
],
0
,
true
);
++
var2
;
}
}
throw
new
JceDecodeException
(
"size invalid: "
+
var4
);
case
13
:
JceInputStream
$HeadData
var5
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var5
);
if
(
var5
.
type
!=
0
)
{
throw
new
JceDecodeException
(
"type mismatch, tag: "
+
var2
+
", type: "
+
var6
.
type
+
", "
+
var5
.
type
);
}
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
<
0
||
var4
>
this
.
buffer
.
capacity
())
{
throw
new
JceDecodeException
(
"invalid size, tag: "
+
var2
+
", type: "
+
var6
.
type
+
", "
+
var5
.
type
+
", size: "
+
var4
);
}
var1
=
new
byte
[
var4
];
this
.
buffer
.
get
(
var1
);
break
;
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
return
var1
;
}
public
double
[]
read
(
double
[]
var1
,
int
var2
,
boolean
var3
)
{
var1
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var6
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var6
);
if
(
var6
.
type
==
9
)
{
int
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var4
);
}
else
{
double
[]
var5
=
new
double
[
var4
];
var2
=
0
;
while
(
true
)
{
var1
=
var5
;
if
(
var2
>=
var4
)
{
return
var1
;
}
var5
[
var2
]
=
this
.
read
(
var5
[
0
],
0
,
true
);
++
var2
;
}
}
}
throw
new
JceDecodeException
(
"type mismatch."
);
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
float
[]
read
(
float
[]
var1
,
int
var2
,
boolean
var3
)
{
var1
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var6
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var6
);
if
(
var6
.
type
==
9
)
{
int
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var4
);
}
else
{
float
[]
var5
=
new
float
[
var4
];
var2
=
0
;
while
(
true
)
{
var1
=
var5
;
if
(
var2
>=
var4
)
{
return
var1
;
}
var5
[
var2
]
=
this
.
read
(
var5
[
0
],
0
,
true
);
++
var2
;
}
}
}
throw
new
JceDecodeException
(
"type mismatch."
);
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
int
[]
read
(
int
[]
var1
,
int
var2
,
boolean
var3
)
{
var1
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var6
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var6
);
if
(
var6
.
type
==
9
)
{
int
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var4
);
}
else
{
int
[]
var5
=
new
int
[
var4
];
var2
=
0
;
while
(
true
)
{
var1
=
var5
;
if
(
var2
>=
var4
)
{
return
var1
;
}
var5
[
var2
]
=
this
.
read
(
var5
[
0
],
0
,
true
);
++
var2
;
}
}
}
throw
new
JceDecodeException
(
"type mismatch."
);
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
long
[]
read
(
long
[]
var1
,
int
var2
,
boolean
var3
)
{
var1
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var6
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var6
);
if
(
var6
.
type
==
9
)
{
int
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var4
);
}
else
{
long
[]
var5
=
new
long
[
var4
];
var2
=
0
;
while
(
true
)
{
var1
=
var5
;
if
(
var2
>=
var4
)
{
return
var1
;
}
var5
[
var2
]
=
this
.
read
(
var5
[
0
],
0
,
true
);
++
var2
;
}
}
}
throw
new
JceDecodeException
(
"type mismatch."
);
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
JceStruct
[]
read
(
JceStruct
[]
var1
,
int
var2
,
boolean
var3
)
{
return
(
JceStruct
[])
this
.
readArray
((
Object
[])
var1
,
var2
,
var3
);
}
public
String
[]
read
(
String
[]
var1
,
int
var2
,
boolean
var3
)
{
return
(
String
[])
this
.
readArray
((
Object
[])
var1
,
var2
,
var3
);
}
public
short
[]
read
(
short
[]
var1
,
int
var2
,
boolean
var3
)
{
var1
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var6
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var6
);
if
(
var6
.
type
==
9
)
{
int
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var4
);
}
else
{
short
[]
var5
=
new
short
[
var4
];
var2
=
0
;
while
(
true
)
{
var1
=
var5
;
if
(
var2
>=
var4
)
{
return
var1
;
}
var5
[
var2
]
=
this
.
read
(
var5
[
0
],
0
,
true
);
++
var2
;
}
}
}
throw
new
JceDecodeException
(
"type mismatch."
);
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
boolean
[]
read
(
boolean
[]
var1
,
int
var2
,
boolean
var3
)
{
var1
=
null
;
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var6
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var6
);
if
(
var6
.
type
==
9
)
{
int
var4
=
this
.
read
(
0
,
0
,
true
);
if
(
var4
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var4
);
}
else
{
boolean
[]
var5
=
new
boolean
[
var4
];
var2
=
0
;
while
(
true
)
{
var1
=
var5
;
if
(
var2
>=
var4
)
{
return
var1
;
}
var5
[
var2
]
=
this
.
read
(
var5
[
0
],
0
,
true
);
++
var2
;
}
}
}
throw
new
JceDecodeException
(
"type mismatch."
);
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
<
T
>
List
<
T
>
readArray
(
List
<
T
>
var1
,
int
var2
,
boolean
var3
)
{
byte
var4
=
0
;
if
(
var1
!=
null
&&
!
var1
.
isEmpty
())
{
Object
[]
var6
=
this
.
readArrayImpl
(
var1
.
get
(
0
),
var2
,
var3
);
if
(
var6
==
null
)
{
return
null
;
}
else
{
ArrayList
var5
=
new
ArrayList
();
for
(
var2
=
var4
;
var2
<
var6
.
length
;
++
var2
)
{
var5
.
add
(
var6
[
var2
]);
}
return
var5
;
}
}
else
{
return
new
ArrayList
<>();
}
}
public
<
T
>
T
[]
readArray
(
T
[]
var1
,
int
var2
,
boolean
var3
)
{
if
(
var1
!=
null
&&
var1
.
length
!=
0
)
{
return
this
.
readArrayImpl
(
var1
[
0
],
var2
,
var3
);
}
else
{
throw
new
JceDecodeException
(
"unable to get type of key and value."
);
}
}
public
String
readByteString
(
String
var1
,
int
var2
,
boolean
var3
)
{
if
(
this
.
skipToTag
(
var2
))
{
JceInputStream
$HeadData
var5
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var5
);
byte
[]
var6
;
switch
(
var5
.
type
)
{
case
6
:
byte
var4
=
this
.
buffer
.
get
();
var2
=
var4
;
if
(
var4
<
0
)
{
var2
=
var4
+
256
;
}
var6
=
new
byte
[
var2
];
this
.
buffer
.
get
(
var6
);
return
HexUtil
.
bytes2HexStr
(
var6
);
case
7
:
var2
=
this
.
buffer
.
getInt
();
if
(
var2
<=
104857600
&&
var2
>=
0
&&
var2
<=
this
.
buffer
.
capacity
())
{
var6
=
new
byte
[
var2
];
this
.
buffer
.
get
(
var6
);
return
HexUtil
.
bytes2HexStr
(
var6
);
}
throw
new
JceDecodeException
(
"String too long: "
+
var2
);
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var3
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
else
{
return
var1
;
}
}
public
void
readHead
(
JceInputStream
$HeadData
var1
)
{
readHead
(
var1
,
this
.
buffer
);
}
public
List
<
java
.
io
.
Serializable
>
readList
(
int
var1
,
boolean
var2
)
{
ArrayList
<
java
.
io
.
Serializable
>
var6
=
new
ArrayList
<
java
.
io
.
Serializable
>();
if
(
this
.
skipToTag
(
var1
))
{
JceInputStream
$HeadData
var7
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var7
);
if
(
var7
.
type
==
9
)
{
int
var5
=
this
.
read
(
0
,
0
,
true
);
if
(
var5
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var5
);
}
var1
=
0
;
for
(;
var1
<
var5
;
++
var1
)
{
var7
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var7
);
switch
(
var7
.
type
)
{
case
0
:
this
.
skip
(
1
);
break
;
case
1
:
this
.
skip
(
2
);
break
;
case
2
:
this
.
skip
(
4
);
break
;
case
3
:
this
.
skip
(
8
);
break
;
case
4
:
this
.
skip
(
4
);
break
;
case
5
:
this
.
skip
(
8
);
break
;
case
6
:
byte
var4
=
this
.
buffer
.
get
();
int
var3
=
var4
;
if
(
var4
<
0
)
{
var3
=
var4
+
256
;
}
this
.
skip
(
var3
);
break
;
case
7
:
this
.
skip
(
this
.
buffer
.
getInt
());
case
8
:
case
9
:
break
;
case
10
:
try
{
JceStruct
var9
=
(
JceStruct
)
Class
.
forName
(
JceStruct
.
class
.
getName
()).
getConstructor
().
newInstance
();
var9
.
readFrom
(
this
);
this
.
skipToStructEnd
();
var6
.
add
(
var9
);
break
;
}
catch
(
Exception
var8
)
{
var8
.
printStackTrace
();
throw
new
JceDecodeException
(
"type mismatch."
+
var8
);
}
case
11
:
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
case
12
:
var6
.
add
(
new
Integer
(
0
));
}
}
}
else
{
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var2
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
return
var6
;
}
public
<
K
,
V
>
HashMap
<
K
,
V
>
readMap
(
Map
<
K
,
V
>
var1
,
int
var2
,
boolean
var3
)
{
return
(
HashMap
<
K
,
V
>)
this
.
readMap
(
new
HashMap
<
K
,
V
>(),
var1
,
var2
,
var3
);
}
public
String
readString
(
int
var1
,
boolean
var2
)
{
String
var4
=
null
;
if
(
this
.
skipToTag
(
var1
))
{
JceInputStream
$HeadData
var8
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var8
);
switch
(
var8
.
type
)
{
case
6
:
byte
var3
=
this
.
buffer
.
get
();
var1
=
var3
;
if
(
var3
<
0
)
{
var1
=
var3
+
256
;
}
byte
[]
var10
=
new
byte
[
var1
];
this
.
buffer
.
get
(
var10
);
try
{
var4
=
new
String
(
var10
,
this
.
sServerEncoding
);
break
;
}
catch
(
UnsupportedEncodingException
var7
)
{
return
new
String
(
var10
);
}
case
7
:
var1
=
this
.
buffer
.
getInt
();
if
(
var1
<=
104857600
&&
var1
>=
0
&&
var1
<=
this
.
buffer
.
capacity
())
{
byte
[]
var9
=
new
byte
[
var1
];
this
.
buffer
.
get
(
var9
);
try
{
String
var5
=
new
String
(
var9
,
this
.
sServerEncoding
);
return
var5
;
}
catch
(
UnsupportedEncodingException
var6
)
{
return
new
String
(
var9
);
}
}
throw
new
JceDecodeException
(
"String too long: "
+
var1
);
default
:
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var2
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
return
var4
;
}
public
Map
<
String
,
String
>
readStringMap
(
int
var1
,
boolean
var2
)
{
HashMap
<
String
,
String
>
var4
=
new
HashMap
<>();
if
(
this
.
skipToTag
(
var1
))
{
JceInputStream
$HeadData
var5
=
new
JceInputStream
$HeadData
();
this
.
readHead
(
var5
);
if
(
var5
.
type
==
8
)
{
int
var3
=
this
.
read
(
0
,
0
,
true
);
if
(
var3
<
0
)
{
throw
new
JceDecodeException
(
"size invalid: "
+
var3
);
}
for
(
var1
=
0
;
var1
<
var3
;
++
var1
)
{
var4
.
put
(
this
.
readString
(
0
,
true
),
this
.
readString
(
1
,
true
));
}
}
else
{
throw
new
JceDecodeException
(
"type mismatch."
);
}
}
else
if
(
var2
)
{
throw
new
JceDecodeException
(
"require field not exist."
);
}
return
var4
;
}
public
int
setServerEncoding
(
String
var1
)
{
this
.
sServerEncoding
=
var1
;
return
0
;
}
public
void
skipToStructEnd
()
{
JceInputStream
$HeadData
var1
=
new
JceInputStream
$HeadData
();
do
{
this
.
readHead
(
var1
);
this
.
skipField
(
var1
.
type
);
}
while
(
var1
.
type
!=
11
);
}
public
boolean
skipToTag
(
int
n2
)
{
try
{
JceInputStream
$HeadData
jceInputStream$HeadData
=
new
JceInputStream
$HeadData
();
do
{
int
n3
=
this
.
peakHead
(
jceInputStream$HeadData
);
if
(
jceInputStream$HeadData
.
type
==
11
)
{
return
false
;
}
if
(
n2
<=
jceInputStream$HeadData
.
tag
)
{
return
n2
==
jceInputStream$HeadData
.
tag
;
}
this
.
skip
(
n3
);
this
.
skipField
(
jceInputStream$HeadData
.
type
);
}
while
(
true
);
}
catch
(
JceDecodeException
jceDecodeException
)
{
return
false
;
}
catch
(
BufferUnderflowException
bufferUnderflowException
)
{
// empty catch block
}
return
false
;
}
public
void
warp
(
byte
[]
var1
)
{
this
.
wrap
(
var1
);
}
public
void
wrap
(
byte
[]
var1
)
{
this
.
buffer
=
ByteBuffer
.
wrap
(
var1
);
}
}
mirai-debug/src/test/java/jce/jce/JceOutputStream.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
import
java.io.UnsupportedEncodingException
;
import
java.nio.ByteBuffer
;
import
java.util.Arrays
;
import
java.util.Collection
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map.Entry
;
public
class
JceOutputStream
{
// $FF: renamed from: bs java.nio.ByteBuffer
private
ByteBuffer
field_80728
;
private
OnIllegalArgumentException
exceptionHandler
;
protected
String
sServerEncoding
;
public
JceOutputStream
()
{
this
(
128
);
}
public
JceOutputStream
(
int
var1
)
{
this
.
sServerEncoding
=
"GBK"
;
this
.
field_80728
=
ByteBuffer
.
allocate
(
var1
);
}
public
JceOutputStream
(
ByteBuffer
var1
)
{
this
.
sServerEncoding
=
"GBK"
;
this
.
field_80728
=
var1
;
}
public
static
void
main
(
String
[]
var0
)
{
JceOutputStream
var2
=
new
JceOutputStream
();
var2
.
write
(
1311768467283714885L
,
0
);
ByteBuffer
var1
=
var2
.
getByteBuffer
();
System
.
out
.
println
(
HexUtil
.
bytes2HexStr
(
var1
.
array
()));
System
.
out
.
println
(
Arrays
.
toString
(
var2
.
toByteArray
()));
}
private
void
writeArray
(
Object
[]
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
9
,
var2
);
this
.
write
(
var1
.
length
,
0
);
int
var3
=
var1
.
length
;
for
(
var2
=
0
;
var2
<
var3
;
++
var2
)
{
this
.
write
(
var1
[
var2
],
0
);
}
}
public
ByteBuffer
getByteBuffer
()
{
return
this
.
field_80728
;
}
public
OnIllegalArgumentException
getExceptionHandler
()
{
return
this
.
exceptionHandler
;
}
public
void
reserve
(
int
var1
)
{
if
(
this
.
field_80728
.
remaining
()
<
var1
)
{
int
var2
=
(
this
.
field_80728
.
capacity
()
+
var1
)
*
2
;
ByteBuffer
var3
;
try
{
var3
=
ByteBuffer
.
allocate
(
var2
);
var3
.
put
(
this
.
field_80728
.
array
(),
0
,
this
.
field_80728
.
position
());
}
catch
(
IllegalArgumentException
var4
)
{
if
(
this
.
exceptionHandler
!=
null
)
{
this
.
exceptionHandler
.
onException
(
var4
,
this
.
field_80728
,
var1
,
var2
);
}
throw
var4
;
}
this
.
field_80728
=
var3
;
}
}
public
void
setExceptionHandler
(
OnIllegalArgumentException
var1
)
{
this
.
exceptionHandler
=
var1
;
}
public
int
setServerEncoding
(
String
var1
)
{
this
.
sServerEncoding
=
var1
;
return
0
;
}
public
byte
[]
toByteArray
()
{
byte
[]
var1
=
new
byte
[
this
.
field_80728
.
position
()];
System
.
arraycopy
(
this
.
field_80728
.
array
(),
0
,
var1
,
0
,
this
.
field_80728
.
position
());
return
var1
;
}
public
void
write
(
byte
var1
,
int
var2
)
{
this
.
reserve
(
3
);
if
(
var1
==
0
)
{
this
.
writeHead
((
byte
)
12
,
var2
);
}
else
{
this
.
writeHead
((
byte
)
0
,
var2
);
this
.
field_80728
.
put
(
var1
);
}
}
public
void
write
(
double
var1
,
int
var3
)
{
this
.
reserve
(
10
);
this
.
writeHead
((
byte
)
5
,
var3
);
this
.
field_80728
.
putDouble
(
var1
);
}
public
void
write
(
float
var1
,
int
var2
)
{
this
.
reserve
(
6
);
this
.
writeHead
((
byte
)
4
,
var2
);
this
.
field_80728
.
putFloat
(
var1
);
}
public
void
write
(
int
var1
,
int
var2
)
{
this
.
reserve
(
6
);
if
(
var1
>=
-
32768
&&
var1
<=
32767
)
{
this
.
write
((
short
)
var1
,
var2
);
}
else
{
this
.
writeHead
((
byte
)
2
,
var2
);
this
.
field_80728
.
putInt
(
var1
);
}
}
public
void
write
(
long
var1
,
int
id
)
{
this
.
reserve
(
10
);
if
(
var1
>=
-
2147483648L
&&
var1
<=
2147483647L
)
{
this
.
write
((
int
)
var1
,
id
);
}
else
{
this
.
writeHead
((
byte
)
3
,
id
);
this
.
field_80728
.
putLong
(
var1
);
}
}
public
void
write
(
JceStruct
var1
,
int
var2
)
{
this
.
reserve
(
2
);
this
.
writeHead
((
byte
)
10
,
var2
);
var1
.
writeTo
(
this
);
this
.
reserve
(
2
);
this
.
writeHead
((
byte
)
11
,
0
);
}
public
void
write
(
Boolean
var1
,
int
var2
)
{
this
.
write
((
boolean
)
var1
,
var2
);
}
public
void
write
(
Byte
var1
,
int
var2
)
{
this
.
write
((
byte
)
var1
,
var2
);
}
public
void
write
(
Double
var1
,
int
var2
)
{
this
.
write
((
double
)
var1
,
var2
);
}
public
void
write
(
Float
var1
,
int
var2
)
{
this
.
write
((
float
)
var1
,
var2
);
}
public
void
write
(
Integer
var1
,
int
var2
)
{
this
.
write
((
int
)
var1
,
var2
);
}
public
void
write
(
Long
var1
,
int
var2
)
{
this
.
write
((
long
)
var1
,
var2
);
}
public
void
write
(
Object
var1
,
int
var2
)
{
if
(
var1
instanceof
Byte
)
{
this
.
write
((
Byte
)
var1
,
var2
);
}
else
if
(
var1
instanceof
Boolean
)
{
this
.
write
((
Boolean
)
var1
,
var2
);
}
else
if
(
var1
instanceof
Short
)
{
this
.
write
((
Short
)
var1
,
var2
);
}
else
if
(
var1
instanceof
Integer
)
{
this
.
write
((
Integer
)
var1
,
var2
);
}
else
if
(
var1
instanceof
Long
)
{
this
.
write
((
Long
)
var1
,
var2
);
}
else
if
(
var1
instanceof
Float
)
{
this
.
write
((
Float
)
var1
,
var2
);
}
else
if
(
var1
instanceof
Double
)
{
this
.
write
((
Double
)
var1
,
var2
);
}
else
if
(
var1
instanceof
String
)
{
this
.
write
((
String
)
var1
,
var2
);
}
else
if
(
var1
instanceof
Map
)
{
this
.
write
((
Map
)
var1
,
var2
);
}
else
if
(
var1
instanceof
List
)
{
this
.
write
((
List
)
var1
,
var2
);
}
else
if
(
var1
instanceof
JceStruct
)
{
this
.
write
((
JceStruct
)
var1
,
var2
);
}
else
if
(
var1
instanceof
byte
[])
{
this
.
write
((
byte
[])
var1
,
var2
);
}
else
if
(
var1
instanceof
boolean
[])
{
this
.
write
((
boolean
[])
var1
,
var2
);
}
else
if
(
var1
instanceof
short
[])
{
this
.
write
((
short
[])
var1
,
var2
);
}
else
if
(
var1
instanceof
int
[])
{
this
.
write
((
int
[])
var1
,
var2
);
}
else
if
(
var1
instanceof
long
[])
{
this
.
write
((
long
[])
var1
,
var2
);
}
else
if
(
var1
instanceof
float
[])
{
this
.
write
((
float
[])
var1
,
var2
);
}
else
if
(
var1
instanceof
double
[])
{
this
.
write
((
double
[])
var1
,
var2
);
}
else
if
(
var1
.
getClass
().
isArray
())
{
this
.
writeArray
((
Object
[])
var1
,
var2
);
}
else
if
(
var1
instanceof
Collection
)
{
this
.
write
((
Collection
)
var1
,
var2
);
}
else
{
throw
new
JceEncodeException
(
"write object error: unsupport type. "
+
var1
.
getClass
());
}
}
public
void
write
(
Short
var1
,
int
var2
)
{
this
.
write
((
short
)
var1
,
var2
);
}
public
void
write
(
String
var1
,
int
var2
)
{
byte
[]
var5
;
label16:
{
byte
[]
var3
;
try
{
var3
=
var1
.
getBytes
(
this
.
sServerEncoding
);
}
catch
(
UnsupportedEncodingException
var4
)
{
var5
=
var1
.
getBytes
();
break
label16
;
}
var5
=
var3
;
}
this
.
reserve
(
var5
.
length
+
10
);
if
(
var5
.
length
>
255
)
{
this
.
writeHead
((
byte
)
7
,
var2
);
this
.
field_80728
.
putInt
(
var5
.
length
);
}
else
{
this
.
writeHead
((
byte
)
6
,
var2
);
this
.
field_80728
.
put
((
byte
)
var5
.
length
);
}
this
.
field_80728
.
put
(
var5
);
}
public
<
T
>
void
write
(
Collection
<
T
>
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
9
,
var2
);
if
(
var1
==
null
)
{
var2
=
0
;
}
else
{
var2
=
var1
.
size
();
}
this
.
write
(
var2
,
0
);
if
(
var1
!=
null
)
{
for
(
T
t
:
var1
)
{
this
.
write
(
t
,
0
);
}
}
}
public
<
K
,
V
>
void
write
(
Map
<
K
,
V
>
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
8
,
var2
);
if
(
var1
==
null
)
{
var2
=
0
;
}
else
{
var2
=
var1
.
size
();
}
this
.
write
(
var2
,
0
);
if
(
var1
!=
null
)
{
for
(
Entry
<
K
,
V
>
kvEntry
:
var1
.
entrySet
())
{
this
.
write
(((
Entry
)
kvEntry
).
getKey
(),
0
);
this
.
write
(((
Entry
)
kvEntry
).
getValue
(),
1
);
}
}
}
public
void
write
(
short
var1
,
int
var2
)
{
this
.
reserve
(
4
);
if
(
var1
>=
-
128
&&
var1
<=
127
)
{
this
.
write
((
byte
)
var1
,
var2
);
}
else
{
this
.
writeHead
((
byte
)
1
,
var2
);
this
.
field_80728
.
putShort
(
var1
);
}
}
public
void
write
(
boolean
var1
,
int
var2
)
{
byte
var3
;
if
(
var1
)
{
var3
=
1
;
}
else
{
var3
=
0
;
}
this
.
write
(
var3
,
var2
);
}
public
void
write
(
byte
[]
var1
,
int
var2
)
{
this
.
reserve
(
var1
.
length
+
8
);
this
.
writeHead
((
byte
)
13
,
var2
);
this
.
writeHead
((
byte
)
0
,
0
);
this
.
write
(
var1
.
length
,
0
);
this
.
field_80728
.
put
(
var1
);
}
public
void
write
(
double
[]
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
9
,
var2
);
this
.
write
(
var1
.
length
,
0
);
int
var3
=
var1
.
length
;
for
(
var2
=
0
;
var2
<
var3
;
++
var2
)
{
this
.
write
(
var1
[
var2
],
0
);
}
}
public
void
write
(
float
[]
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
9
,
var2
);
this
.
write
(
var1
.
length
,
0
);
int
var3
=
var1
.
length
;
for
(
var2
=
0
;
var2
<
var3
;
++
var2
)
{
this
.
write
(
var1
[
var2
],
0
);
}
}
public
void
write
(
int
[]
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
9
,
var2
);
this
.
write
(
var1
.
length
,
0
);
int
var3
=
var1
.
length
;
for
(
var2
=
0
;
var2
<
var3
;
++
var2
)
{
this
.
write
(
var1
[
var2
],
0
);
}
}
public
void
write
(
long
[]
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
9
,
var2
);
this
.
write
(
var1
.
length
,
0
);
int
var3
=
var1
.
length
;
for
(
var2
=
0
;
var2
<
var3
;
++
var2
)
{
this
.
write
(
var1
[
var2
],
0
);
}
}
public
<
T
>
void
write
(
T
[]
var1
,
int
var2
)
{
this
.
writeArray
(
var1
,
var2
);
}
public
void
write
(
short
[]
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
9
,
var2
);
this
.
write
(
var1
.
length
,
0
);
int
var3
=
var1
.
length
;
for
(
var2
=
0
;
var2
<
var3
;
++
var2
)
{
this
.
write
(
var1
[
var2
],
0
);
}
}
public
void
write
(
boolean
[]
var1
,
int
var2
)
{
this
.
reserve
(
8
);
this
.
writeHead
((
byte
)
9
,
var2
);
this
.
write
(
var1
.
length
,
0
);
int
var3
=
var1
.
length
;
for
(
var2
=
0
;
var2
<
var3
;
++
var2
)
{
this
.
write
(
var1
[
var2
],
0
);
}
}
public
void
writeByteString
(
String
var1
,
int
var2
)
{
this
.
reserve
(
var1
.
length
()
+
10
);
byte
[]
var3
=
HexUtil
.
hexStr2Bytes
(
var1
);
if
(
var3
.
length
>
255
)
{
this
.
writeHead
((
byte
)
7
,
var2
);
this
.
field_80728
.
putInt
(
var3
.
length
);
this
.
field_80728
.
put
(
var3
);
}
else
{
this
.
writeHead
((
byte
)
6
,
var2
);
this
.
field_80728
.
put
((
byte
)
var3
.
length
);
this
.
field_80728
.
put
(
var3
);
}
}
public
void
writeHead
(
byte
var1
,
int
var2
)
{
byte
var3
;
if
(
var2
<
15
)
{
var3
=
(
byte
)
(
var2
<<
4
|
var1
);
this
.
field_80728
.
put
(
var3
);
}
else
if
(
var2
<
256
)
{
var3
=
(
byte
)
(
var1
|
240
);
this
.
field_80728
.
put
(
var3
);
this
.
field_80728
.
put
((
byte
)
var2
);
}
else
{
throw
new
JceEncodeException
(
"tag is too large: "
+
var2
);
}
}
public
void
writeStringByte
(
String
var1
,
int
var2
)
{
byte
[]
var3
=
HexUtil
.
hexStr2Bytes
(
var1
);
this
.
reserve
(
var3
.
length
+
10
);
if
(
var3
.
length
>
255
)
{
this
.
writeHead
((
byte
)
7
,
var2
);
this
.
field_80728
.
putInt
(
var3
.
length
);
this
.
field_80728
.
put
(
var3
);
}
else
{
this
.
writeHead
((
byte
)
6
,
var2
);
this
.
field_80728
.
put
((
byte
)
var3
.
length
);
this
.
field_80728
.
put
(
var3
);
}
}
}
mirai-debug/src/test/java/jce/jce/JceStruct.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
import
java.io.Serializable
;
public
abstract
class
JceStruct
implements
Serializable
{
public
static
final
byte
BYTE
=
0
;
public
static
final
byte
DOUBLE
=
5
;
public
static
final
byte
FLOAT
=
4
;
public
static
final
byte
INT
=
2
;
public
static
final
int
JCE_MAX_STRING_LENGTH
=
104857600
;
public
static
final
byte
LIST
=
9
;
public
static
final
byte
LONG
=
3
;
public
static
final
byte
MAP
=
8
;
public
static
final
byte
SHORT
=
1
;
public
static
final
byte
SIMPLE_LIST
=
13
;
public
static
final
byte
STRING1
=
6
;
public
static
final
byte
STRING4
=
7
;
public
static
final
byte
STRUCT_BEGIN
=
10
;
public
static
final
byte
STRUCT_END
=
11
;
public
static
final
byte
ZERO_TAG
=
12
;
public
static
String
toDisplaySimpleString
(
JceStruct
var0
)
{
if
(
var0
==
null
)
{
return
null
;
}
else
{
StringBuilder
var1
=
new
StringBuilder
();
var0
.
displaySimple
(
var1
,
0
);
return
var1
.
toString
();
}
}
public
boolean
containField
(
String
var1
)
{
return
false
;
}
public
void
display
(
StringBuilder
var1
,
int
var2
)
{
}
public
void
displaySimple
(
StringBuilder
var1
,
int
var2
)
{
}
public
Object
getFieldByName
(
String
var1
)
{
return
null
;
}
public
JceStruct
newInit
()
{
return
null
;
}
public
abstract
void
readFrom
(
JceInputStream
var1
);
public
void
recyle
()
{
}
public
void
setFieldByName
(
String
var1
,
Object
var2
)
{
}
public
byte
[]
toByteArray
()
{
JceOutputStream
var1
=
new
JceOutputStream
();
this
.
writeTo
(
var1
);
return
var1
.
toByteArray
();
}
public
byte
[]
toByteArray
(
String
var1
)
{
JceOutputStream
var2
=
new
JceOutputStream
();
var2
.
setServerEncoding
(
var1
);
this
.
writeTo
(
var2
);
return
var2
.
toByteArray
();
}
public
String
toString
()
{
StringBuilder
var1
=
new
StringBuilder
();
this
.
display
(
var1
,
0
);
return
var1
.
toString
();
}
public
abstract
void
writeTo
(
JceOutputStream
var1
);
}
mirai-debug/src/test/java/jce/jce/JceUtil.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
import
java.nio.ByteBuffer
;
import
java.util.Iterator
;
import
java.util.List
;
public
final
class
JceUtil
{
private
static
final
byte
[]
highDigits
;
private
static
final
int
iConstant
=
37
;
private
static
final
int
iTotal
=
17
;
private
static
final
byte
[]
lowDigits
;
static
{
byte
[]
var1
=
new
byte
[]{
48
,
49
,
50
,
51
,
52
,
53
,
54
,
55
,
56
,
57
,
65
,
66
,
67
,
68
,
69
,
70
};
byte
[]
var2
=
new
byte
[
256
];
byte
[]
var3
=
new
byte
[
256
];
for
(
int
var0
=
0
;
var0
<
256
;
++
var0
)
{
var2
[
var0
]
=
var1
[
var0
>>>
4
];
var3
[
var0
]
=
var1
[
var0
&
15
];
}
highDigits
=
var2
;
lowDigits
=
var3
;
}
public
static
int
compareTo
(
byte
var0
,
byte
var1
)
{
if
(
var0
<
var1
)
{
return
-
1
;
}
else
{
return
var0
>
var1
?
1
:
0
;
}
}
public
static
int
compareTo
(
char
var0
,
char
var1
)
{
if
(
var0
<
var1
)
{
return
-
1
;
}
else
{
return
var0
>
var1
?
1
:
0
;
}
}
public
static
int
compareTo
(
double
var0
,
double
var2
)
{
if
(
var0
<
var2
)
{
return
-
1
;
}
else
{
return
var0
>
var2
?
1
:
0
;
}
}
public
static
int
compareTo
(
float
var0
,
float
var1
)
{
if
(
var0
<
var1
)
{
return
-
1
;
}
else
{
return
var0
>
var1
?
1
:
0
;
}
}
public
static
int
compareTo
(
int
var0
,
int
var1
)
{
if
(
var0
<
var1
)
{
return
-
1
;
}
else
{
return
var0
>
var1
?
1
:
0
;
}
}
public
static
int
compareTo
(
long
var0
,
long
var2
)
{
if
(
var0
<
var2
)
{
return
-
1
;
}
else
{
return
var0
>
var2
?
1
:
0
;
}
}
public
static
<
T
extends
Comparable
<
T
>>
int
compareTo
(
T
var0
,
T
var1
)
{
return
var0
.
compareTo
(
var1
);
}
public
static
<
T
extends
Comparable
<
T
>>
int
compareTo
(
List
<
T
>
var0
,
List
<
T
>
var1
)
{
Iterator
var3
=
var0
.
iterator
();
Iterator
var4
=
var1
.
iterator
();
while
(
var3
.
hasNext
()
&&
var4
.
hasNext
())
{
int
var2
=
((
Comparable
)
var3
.
next
()).
compareTo
(
var4
.
next
());
if
(
var2
!=
0
)
{
return
var2
;
}
}
return
compareTo
(
var3
.
hasNext
(),
var4
.
hasNext
());
}
public
static
int
compareTo
(
short
var0
,
short
var1
)
{
if
(
var0
<
var1
)
{
return
-
1
;
}
else
{
return
var0
>
var1
?
1
:
0
;
}
}
public
static
int
compareTo
(
boolean
var0
,
boolean
var1
)
{
byte
var3
=
1
;
byte
var2
;
if
(
var0
)
{
var2
=
1
;
}
else
{
var2
=
0
;
}
if
(!
var1
)
{
var3
=
0
;
}
return
var2
-
var3
;
}
public
static
int
compareTo
(
byte
[]
var0
,
byte
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
compareTo
(
var0
[
var2
],
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
int
compareTo
(
char
[]
var0
,
char
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
compareTo
(
var0
[
var2
],
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
int
compareTo
(
double
[]
var0
,
double
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
compareTo
(
var0
[
var2
],
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
int
compareTo
(
float
[]
var0
,
float
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
compareTo
(
var0
[
var2
],
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
int
compareTo
(
int
[]
var0
,
int
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
compareTo
(
var0
[
var2
],
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
int
compareTo
(
long
[]
var0
,
long
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
compareTo
(
var0
[
var2
],
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
<
T
extends
Comparable
<
T
>>
int
compareTo
(
T
[]
var0
,
T
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
var0
[
var2
].
compareTo
(
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
int
compareTo
(
short
[]
var0
,
short
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
compareTo
(
var0
[
var2
],
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
int
compareTo
(
boolean
[]
var0
,
boolean
[]
var1
)
{
int
var3
=
0
;
for
(
int
var2
=
0
;
var2
<
var0
.
length
&&
var3
<
var1
.
length
;
++
var2
)
{
int
var4
=
compareTo
(
var0
[
var2
],
var1
[
var3
]);
if
(
var4
!=
0
)
{
return
var4
;
}
++
var3
;
}
return
compareTo
(
var0
.
length
,
var1
.
length
);
}
public
static
boolean
equals
(
byte
var0
,
byte
var1
)
{
return
var0
==
var1
;
}
public
static
boolean
equals
(
char
var0
,
char
var1
)
{
return
var0
==
var1
;
}
public
static
boolean
equals
(
double
var0
,
double
var2
)
{
return
var0
==
var2
;
}
public
static
boolean
equals
(
float
var0
,
float
var1
)
{
return
var0
==
var1
;
}
public
static
boolean
equals
(
int
var0
,
int
var1
)
{
return
var0
==
var1
;
}
public
static
boolean
equals
(
long
var0
,
long
var2
)
{
return
var0
==
var2
;
}
public
static
boolean
equals
(
Object
var0
,
Object
var1
)
{
return
var0
.
equals
(
var1
);
}
public
static
boolean
equals
(
short
var0
,
short
var1
)
{
return
var0
==
var1
;
}
public
static
boolean
equals
(
boolean
var0
,
boolean
var1
)
{
return
var0
==
var1
;
}
public
static
String
getHexdump
(
ByteBuffer
var0
)
{
int
var1
=
var0
.
remaining
();
if
(
var1
==
0
)
{
return
"empty"
;
}
else
{
StringBuffer
var4
=
new
StringBuffer
(
var0
.
remaining
()
*
3
-
1
);
int
var2
=
var0
.
position
();
int
var3
=
var0
.
get
()
&
255
;
var4
.
append
((
char
)
highDigits
[
var3
]);
var4
.
append
((
char
)
lowDigits
[
var3
]);
--
var1
;
while
(
var1
>
0
)
{
var4
.
append
(
' '
);
var3
=
var0
.
get
()
&
255
;
var4
.
append
((
char
)
highDigits
[
var3
]);
var4
.
append
((
char
)
lowDigits
[
var3
]);
--
var1
;
}
var0
.
position
(
var2
);
return
var4
.
toString
();
}
}
public
static
String
getHexdump
(
byte
[]
var0
)
{
return
getHexdump
(
ByteBuffer
.
wrap
(
var0
));
}
public
static
byte
[]
getJceBufArray
(
ByteBuffer
var0
)
{
byte
[]
var1
=
new
byte
[
var0
.
position
()];
System
.
arraycopy
(
var0
.
array
(),
0
,
var1
,
0
,
var1
.
length
);
return
var1
;
}
public
static
int
hashCode
(
byte
var0
)
{
return
var0
+
629
;
}
public
static
int
hashCode
(
char
var0
)
{
return
var0
+
629
;
}
public
static
int
hashCode
(
double
var0
)
{
return
hashCode
(
Double
.
doubleToLongBits
(
var0
));
}
public
static
int
hashCode
(
float
var0
)
{
return
Float
.
floatToIntBits
(
var0
)
+
629
;
}
public
static
int
hashCode
(
int
var0
)
{
return
var0
+
629
;
}
public
static
int
hashCode
(
long
var0
)
{
return
(
int
)
(
var0
>>
32
^
var0
)
+
629
;
}
public
static
int
hashCode
(
Object
var0
)
{
if
(
var0
==
null
)
{
return
629
;
}
else
if
(
var0
.
getClass
().
isArray
())
{
if
(
var0
instanceof
long
[])
{
return
hashCode
((
long
[])
((
long
[])
var0
));
}
else
if
(
var0
instanceof
int
[])
{
return
hashCode
((
int
[])
((
int
[])
var0
));
}
else
if
(
var0
instanceof
short
[])
{
return
hashCode
((
short
[])
((
short
[])
var0
));
}
else
if
(
var0
instanceof
char
[])
{
return
hashCode
((
char
[])
((
char
[])
var0
));
}
else
if
(
var0
instanceof
byte
[])
{
return
hashCode
((
byte
[])
((
byte
[])
var0
));
}
else
if
(
var0
instanceof
double
[])
{
return
hashCode
((
double
[])
((
double
[])
var0
));
}
else
if
(
var0
instanceof
float
[])
{
return
hashCode
((
float
[])
((
float
[])
var0
));
}
else
if
(
var0
instanceof
boolean
[])
{
return
hashCode
((
boolean
[])
((
boolean
[])
var0
));
}
else
{
return
var0
instanceof
JceStruct
[]
?
hashCode
((
JceStruct
[])
((
JceStruct
[])
var0
))
:
hashCode
((
Object
)
((
Object
[])
((
Object
[])
var0
)));
}
}
else
{
return
var0
instanceof
JceStruct
?
var0
.
hashCode
()
:
var0
.
hashCode
()
+
629
;
}
}
public
static
int
hashCode
(
short
var0
)
{
return
var0
+
629
;
}
public
static
int
hashCode
(
boolean
var0
)
{
byte
var1
;
if
(
var0
)
{
var1
=
0
;
}
else
{
var1
=
1
;
}
return
var1
+
629
;
}
public
static
int
hashCode
(
byte
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
var1
=
var1
*
37
+
var0
[
var2
];
++
var2
;
}
}
return
var3
;
}
public
static
int
hashCode
(
char
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
var1
=
var1
*
37
+
var0
[
var2
];
++
var2
;
}
}
return
var3
;
}
public
static
int
hashCode
(
double
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
var1
=
var1
*
37
+
(
int
)
(
Double
.
doubleToLongBits
(
var0
[
var2
])
^
Double
.
doubleToLongBits
(
var0
[
var2
])
>>
32
);
++
var2
;
}
}
return
var3
;
}
public
static
int
hashCode
(
float
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
var1
=
var1
*
37
+
Float
.
floatToIntBits
(
var0
[
var2
]);
++
var2
;
}
}
return
var3
;
}
public
static
int
hashCode
(
int
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
var1
=
var1
*
37
+
var0
[
var2
];
++
var2
;
}
}
return
var3
;
}
public
static
int
hashCode
(
long
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
var1
=
var1
*
37
+
(
int
)
(
var0
[
var2
]
^
var0
[
var2
]
>>
32
);
++
var2
;
}
}
return
var3
;
}
public
static
int
hashCode
(
JceStruct
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
var1
=
var1
*
37
+
var0
[
var2
].
hashCode
();
++
var2
;
}
}
return
var3
;
}
public
static
int
hashCode
(
short
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
var1
=
var1
*
37
+
var0
[
var2
];
++
var2
;
}
}
return
var3
;
}
public
static
int
hashCode
(
boolean
[]
var0
)
{
int
var3
;
if
(
var0
==
null
)
{
var3
=
629
;
}
else
{
int
var1
=
17
;
int
var2
=
0
;
while
(
true
)
{
var3
=
var1
;
if
(
var2
>=
var0
.
length
)
{
break
;
}
byte
var4
;
if
(
var0
[
var2
])
{
var4
=
0
;
}
else
{
var4
=
1
;
}
var1
=
var4
+
var1
*
37
;
++
var2
;
}
}
return
var3
;
}
}
mirai-debug/src/test/java/jce/jce/OnIllegalArgumentException.java
0 → 100644
View file @
2e17ea68
package
jce.jce
;
import
java.nio.ByteBuffer
;
public
interface
OnIllegalArgumentException
{
void
onException
(
IllegalArgumentException
var1
,
ByteBuffer
var2
,
int
var3
,
int
var4
);
}
mirai-debug/src/test/kotlin/jceTest/jceTest.kt
0 → 100644
View file @
2e17ea68
package
jceTest
import
io.ktor.util.InternalAPI
import
jce.jce.JceInputStream
import
jce.jce.JceOutputStream
import
jce.jce.JceStruct
import
kotlinx.io.core.ByteReadPacket
import
kotlinx.io.core.readBytes
import
net.mamoe.mirai.qqandroid.network.io.JceInput
import
net.mamoe.mirai.qqandroid.network.io.JceOutput
import
net.mamoe.mirai.qqandroid.network.io.buildJcePacket
import
net.mamoe.mirai.utils.io.toUHexString
import
org.junit.Test
private
infix
fun
ByteReadPacket
.
shouldEqualTo
(
another
:
ByteArray
)
{
this
.
readBytes
().
let
{
check
(
it
.
contentEquals
(
another
))
{
"""actual: ${it.toUHexString()}
|required: ${another.toUHexString()}
"""
.
trimMargin
()
}
}
}
@UseExperimental
(
InternalAPI
::
class
)
private
fun
qqJce
(
block
:
JceOutputStream
.()
->
Unit
):
ByteArray
{
return
JceOutputStream
().
apply
(
block
).
toByteArray
()
}
internal
class
JceOutputTest
{
@Test
fun
writeByte
()
{
buildJcePacket
{
writeByte
(
1
,
1
)
writeByte
(-
128
,
2
)
}
shouldEqualTo
qqJce
{
write
(
1
.
toByte
(),
1
)
write
((-
128
).
toByte
(),
2
)
}
}
@Test
fun
writeDouble
()
{
buildJcePacket
{
writeDouble
(
1.0
,
1
)
writeDouble
(-
128.0
,
2
)
}
shouldEqualTo
qqJce
{
write
(
1
.
toDouble
(),
1
)
write
((-
128
).
toDouble
(),
2
)
}
}
@Test
fun
writeFloat
()
{
buildJcePacket
{
writeFloat
(
1.0f
,
1
)
writeFloat
(-
128.0f
,
2
)
}
shouldEqualTo
qqJce
{
write
(
1
.
toFloat
(),
1
)
write
((-
128
).
toFloat
(),
2
)
}
}
@Test
fun
writeFully
()
{
buildJcePacket
{
writeFully
(
byteArrayOf
(
1
,
2
),
1
)
writeFully
(
byteArrayOf
(
1
,
2
),
2
)
}
shouldEqualTo
qqJce
{
write
(
byteArrayOf
(
1
,
2
),
1
)
write
(
byteArrayOf
(
1
,
2
),
2
)
}
}
@Test
fun
testWriteFully
()
{
buildJcePacket
{
writeFully
(
intArrayOf
(
1
,
2
),
1
)
writeFully
(
intArrayOf
(
1
,
2
),
2
)
}
shouldEqualTo
qqJce
{
write
(
intArrayOf
(
1
,
2
),
1
)
write
(
intArrayOf
(
1
,
2
),
2
)
}
}
@Test
fun
testWriteFully1
()
{
buildJcePacket
{
writeFully
(
shortArrayOf
(
1
,
2
),
1
)
writeFully
(
shortArrayOf
(
1
,
2
),
2
)
}
shouldEqualTo
qqJce
{
write
(
shortArrayOf
(
1
,
2
),
1
)
write
(
shortArrayOf
(
1
,
2
),
2
)
}
}
@Test
fun
testWriteFully2
()
{
buildJcePacket
{
writeFully
(
booleanArrayOf
(
true
,
false
),
1
)
writeFully
(
booleanArrayOf
(
true
,
false
),
2
)
}
shouldEqualTo
qqJce
{
write
(
booleanArrayOf
(
true
,
false
),
1
)
write
(
booleanArrayOf
(
true
,
false
),
2
)
}
}
@Test
fun
testWriteFully3
()
{
buildJcePacket
{
writeFully
(
longArrayOf
(
1
,
2
),
1
)
writeFully
(
longArrayOf
(
1
,
2
),
2
)
}
shouldEqualTo
qqJce
{
write
(
longArrayOf
(
1
,
2
),
1
)
write
(
longArrayOf
(
1
,
2
),
2
)
}
}
@Test
fun
testWriteFully4
()
{
buildJcePacket
{
writeFully
(
floatArrayOf
(
1f
,
2f
),
1
)
writeFully
(
floatArrayOf
(
1f
,
2f
),
2
)
}
shouldEqualTo
qqJce
{
write
(
floatArrayOf
(
1f
,
2f
),
1
)
write
(
floatArrayOf
(
1f
,
2f
),
2
)
}
}
@Test
fun
testWriteFully5
()
{
buildJcePacket
{
writeFully
(
doubleArrayOf
(
1.0
,
2.0
),
1
)
writeFully
(
doubleArrayOf
(
1.0
,
2.0
),
2
)
}
shouldEqualTo
qqJce
{
write
(
doubleArrayOf
(
1.0
,
2.0
),
1
)
write
(
doubleArrayOf
(
1.0
,
2.0
),
2
)
}
}
@Test
fun
testWriteFully6
()
{
buildJcePacket
{
writeFully
(
arrayOf
(
"123"
,
"哈哈"
),
1
)
writeFully
(
arrayOf
(
"123"
,
"哈哈"
),
2
)
}
shouldEqualTo
qqJce
{
write
(
arrayOf
(
"123"
,
"哈哈"
),
1
)
write
(
arrayOf
(
"123"
,
"哈哈"
),
2
)
}
}
@Test
fun
writeInt
()
{
buildJcePacket
{
writeInt
(
1
,
1
)
writeInt
(-
128
,
2
)
}
shouldEqualTo
qqJce
{
write
(
1
,
1
)
write
(-
128
,
2
)
}
}
@Test
fun
writeLong
()
{
buildJcePacket
{
writeLong
(
1
,
1
)
writeLong
(-
128
,
2
)
}
shouldEqualTo
qqJce
{
write
(
1L
,
1
)
write
(-
128L
,
2
)
}
}
@Test
fun
writeShort
()
{
buildJcePacket
{
writeShort
(
1
,
1
)
writeShort
(-
128
,
2
)
}
shouldEqualTo
qqJce
{
write
(
1
.
toShort
(),
1
)
write
((-
128
).
toShort
(),
2
)
}
}
@Test
fun
writeBoolean
()
{
buildJcePacket
{
writeBoolean
(
true
,
1
)
writeBoolean
(
false
,
2
)
}
shouldEqualTo
qqJce
{
write
(
true
,
1
)
write
(
false
,
2
)
}
}
@Test
fun
writeString
()
{
buildJcePacket
{
writeString
(
"1"
,
1
)
writeString
(
"哈啊"
,
2
)
}
shouldEqualTo
qqJce
{
write
(
"1"
,
1
)
write
(
"哈啊"
,
2
)
}
}
@Test
fun
writeMap
()
{
buildJcePacket
{
writeMap
(
mapOf
(
""
to
""
),
1
)
writeMap
(
mapOf
(
""
to
123
),
2
)
writeMap
(
mapOf
(
123.0
to
"Hello"
),
3
)
}
shouldEqualTo
qqJce
{
write
(
mapOf
(
""
to
""
),
1
)
write
(
mapOf
(
""
to
123
),
2
)
write
(
mapOf
(
123.0
to
"Hello"
),
3
)
}
}
@Test
fun
writeCollection
()
{
buildJcePacket
{
writeMap
(
mapOf
(
""
to
""
),
1
)
writeMap
(
mapOf
(
""
to
123
),
2
)
writeMap
(
mapOf
(
123.0
to
"Hello"
),
3
)
}
shouldEqualTo
qqJce
{
write
(
mapOf
(
""
to
""
),
1
)
write
(
mapOf
(
""
to
123
),
2
)
write
(
mapOf
(
123.0
to
"Hello"
),
3
)
}
}
data class
TestMiraiStruct
(
val
message
:
String
)
:
net
.
mamoe
.
mirai
.
qqandroid
.
network
.
io
.
JceStruct
()
{
override
fun
writeTo
(
builder
:
JceOutput
)
{
builder
.
writeString
(
message
,
0
)
}
companion
object
:
Factory
<
TestMiraiStruct
>
{
override
fun
newInstanceFrom
(
input
:
JceInput
):
TestMiraiStruct
{
return
TestMiraiStruct
(
input
.
readString
(
0
))
}
}
}
class
TestQQStruct
(
private
var
message
:
String
)
:
JceStruct
()
{
override
fun
readFrom
(
var1
:
JceInputStream
)
{
message
=
var1
.
read
(
""
,
0
,
true
)
}
override
fun
writeTo
(
var1
:
JceOutputStream
)
{
var1
.
write
(
message
,
0
)
}
}
@Test
fun
writeJceStruct
()
{
buildJcePacket
{
writeJceStruct
(
TestMiraiStruct
(
"Hello"
),
0
)
writeJceStruct
(
TestMiraiStruct
(
"嗨"
),
1
)
}
shouldEqualTo
qqJce
{
write
(
TestQQStruct
(
"Hello"
),
0
)
write
(
TestQQStruct
(
"嗨"
),
1
)
}
}
@Test
fun
writeObject
()
{
buildJcePacket
{
writeObject
(
0
.
toByte
(),
1
)
writeObject
(
0
.
toShort
(),
2
)
writeObject
(
0
,
3
)
writeObject
(
0L
,
4
)
writeObject
(
0f
,
5
)
writeObject
(
0.0
,
6
)
writeObject
(
"hello"
,
7
)
writeObject
(
TestMiraiStruct
(
"Hello"
),
8
)
}
shouldEqualTo
qqJce
{
write
(
0
.
toByte
(),
1
)
write
(
0
.
toShort
(),
2
)
write
(
0
,
3
)
write
(
0L
,
4
)
write
(
0f
,
5
)
write
(
0.0
,
6
)
write
(
"hello"
,
7
)
write
(
TestQQStruct
(
"Hello"
),
8
)
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment