diff --git a/README.md b/README.md index 5d32a13..0a7d5b4 100644 --- a/README.md +++ b/README.md @@ -329,6 +329,26 @@ danmakuList.forEach { 在另一方面, 通过这个 `CRC32` 校验和进行用户 ID 反查, 将查询到多个可能的用户, 因此无法确定一条弹幕到底是哪个用户发送的. +如果想获得发送这条弹幕的所有可能的用户的 ID, 可以通过以下方法: + +```kotlin +val possibleUserIds = danmaku.calculatePossibleUserIds() +``` + +返回一个 `List`, 内容为所有可能的用户 ID(至少有一个). + +注意, 第一次使用 `CRC反查` 功能将花费大约 `300ms` 来生成彩虹表, 如果想手动初始化请使用以下代码 + +```kotlin +Crc32Cracker +``` + +(`Crc32Cracker` 是一个惰性初始化的单例) + +通常情况下, 一次 `CRC反查` 耗时大约 `1ms`. + +由于这是一个比较耗时的操作, 请不要每条弹幕都如此操作(相比较 6000 条弹幕的解析只需要 `150ms`). + 番剧的弹幕同理. ## 发送弹幕 diff --git a/src/main/kotlin/com/hiczp/bilibili/api/StreamExtension.kt b/src/main/kotlin/com/hiczp/bilibili/api/StreamExtension.kt index 196ea7b..30e9d62 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/StreamExtension.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/StreamExtension.kt @@ -11,18 +11,19 @@ fun InputStream.readFully(length: Int) = IOUtils.readFully(this, length)!! /** * 以大端模式从流中读取一个 int */ +@UseExperimental(ExperimentalUnsignedTypes::class) fun InputStream.readInt(): Int { val byteArray = readFully(4) - return (byteArray[0].toInt() shl 24) or - (byteArray[1].toInt() shl 16) or - (byteArray[2].toInt() shl 8) or - (byteArray[3].toInt()) + return (byteArray[0].toUByte().toInt() shl 24) or + (byteArray[1].toUByte().toInt() shl 16) or + (byteArray[2].toUByte().toInt() shl 8) or + (byteArray[3].toUByte().toInt()) } /** * 以大端模式从流中读取一个 unsigned int */ -@Suppress("EXPERIMENTAL_API_USAGE") +@UseExperimental(ExperimentalUnsignedTypes::class) fun InputStream.readUInt() = readInt().toUInt() fun InputStream.boundedReader(maxCharsFromTargetReader: Int, charset: Charset = Charsets.UTF_8) =