From 2f1a765f5aea9637531726d656fa086555aeb0cf Mon Sep 17 00:00:00 2001 From: czp3009 Date: Mon, 4 Mar 2019 00:02:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BB=8E=E6=B5=81=E4=B8=AD?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=20byte=20=E6=97=B6=E8=AF=BB=E5=88=B0?= =?UTF-8?q?=E8=B4=9F=E6=95=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++++++++++++++++++ .../com/hiczp/bilibili/api/StreamExtension.kt | 11 +++++----- 2 files changed, 26 insertions(+), 5 deletions(-) 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) =