返回提交历史
Modified
other/bvid_desc.md
+69
-2
XFEstudio/bilibili-API-collect
Update bvid_desc.md (#479)
8f9320e
代码差异
1 个文件
+69
-2
@@ -59,7 +59,7 @@
59
59
60
60
## 转换程序
61
61
62
使用Python、C、TypeScript以及Java作为示例,欢迎社区提交更多例程
62
使用Python、C、TypeScript、Java以及Kotlin作为示例,欢迎社区提交更多例程
63
63
64
64
### Python
65
65
@@ -237,4 +237,71 @@ public class Util {
237
237
return (int) ((r - ADD) ^ XOR);
238
238
}
239
239
}
240
```
240
```
241
242
### Kotlin
243
```kotlin
244
/**
245
* 此程序非完全原创,改编自GH站内某大佬的Java程序,修改了部分代码,且转换为Kotlin
246
* 算法来源同上
247
*/
248
object VideoUtils {
249
//这里是由知乎大佬不知道用什么方法得出的转换用数字
250
var ss = intArrayOf(11, 10, 3, 8, 4, 6, 2, 9, 5, 7)
251
var xor: Long = 177451812 //二进制时加减数1
252
253
var add = 8728348608L //十进制时加减数2
254
255
//变量初始化工作,加载哈希表
256
private const val table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"
257
private val mp = HashMap<String, Int>()
258
private val mp2 = HashMap<Int, String>()
259
260
//现在,定义av号和bv号互转的方法
261
//定义一个power乘方方法,这是转换进制必要的
262
fun power(a: Int, b: Int): Long {
263
var power: Long = 1
264
for (c in 0 until b) power *= a.toLong()
265
return power
266
}
267
268
//bv转av方法
269
fun bv2av(s: String): String {
270
var r: Long = 0
271
//58进制转换
272
for (i in 0..57) {
273
val s1 = table.substring(i, i + 1)
274
mp[s1] = i
275
}
276
for (i in 0..5) {
277
r += mp[s.substring(ss[i], ss[i] + 1)]!! * power(58, i)
278
}
279
//转换完成后,需要处理,带上两个随机数
280
return (r - add xor xor).toString()
281
}
282
283
//av转bv方法
284
fun av2bv(st: String): String {
285
try {
286
var s = java.lang.Long.valueOf(st.split("av".toRegex()).dropLastWhile { it.isEmpty() }
287
.toTypedArray()[1])
288
val sb = StringBuffer("BV1 4 1 7 ")
289
//逆向思路,先将随机数还原
290
s = (s xor xor) + add
291
//58进制转回
292
for (i in 0..57) {
293
val s1 = table.substring(i, i + 1)
294
mp2[i] = s1
295
}
296
for (i in 0..5) {
297
val r = mp2[(s / power(58, i) % 58).toInt()]
298
sb.replace(ss[i], ss[i] + 1, r!!)
299
}
300
return sb.toString()
301
} catch (e: ArrayIndexOutOfBoundsException) {
302
return ""
303
}
304
}
305
306
}
307
```