修正从流中读取 byte 时读到负数的问题

This commit is contained in:
czp3009 2019-03-04 00:02:56 +08:00
parent 75886f5ede
commit 2f1a765f5a
2 changed files with 26 additions and 5 deletions

View File

@ -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`).
番剧的弹幕同理.
## 发送弹幕

View File

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