mirror of
https://github.com/czp3009/bilibili-api.git
synced 2025-02-19 20:50:28 +08:00
修正从流中读取 byte 时读到负数的问题
This commit is contained in:
parent
75886f5ede
commit
2f1a765f5a
20
README.md
20
README.md
@ -329,6 +329,26 @@ danmakuList.forEach {
|
||||
|
||||
在另一方面, 通过这个 `CRC32` 校验和进行用户 ID 反查, 将查询到多个可能的用户, 因此无法确定一条弹幕到底是哪个用户发送的.
|
||||
|
||||
如果想获得发送这条弹幕的所有可能的用户的 ID, 可以通过以下方法:
|
||||
|
||||
```kotlin
|
||||
val possibleUserIds = danmaku.calculatePossibleUserIds()
|
||||
```
|
||||
|
||||
返回一个 `List<Int>`, 内容为所有可能的用户 ID(至少有一个).
|
||||
|
||||
注意, 第一次使用 `CRC反查` 功能将花费大约 `300ms` 来生成彩虹表, 如果想手动初始化请使用以下代码
|
||||
|
||||
```kotlin
|
||||
Crc32Cracker
|
||||
```
|
||||
|
||||
(`Crc32Cracker` 是一个惰性初始化的单例)
|
||||
|
||||
通常情况下, 一次 `CRC反查` 耗时大约 `1ms`.
|
||||
|
||||
由于这是一个比较耗时的操作, 请不要每条弹幕都如此操作(相比较 6000 条弹幕的解析只需要 `150ms`).
|
||||
|
||||
番剧的弹幕同理.
|
||||
|
||||
## 发送弹幕
|
||||
|
@ -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) =
|
||||
|
Loading…
Reference in New Issue
Block a user