XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/bilibili-API-collect

Update bvid_desc.md (#479)

8f9320e
XCちゃん <60663465+XC-Qan@users.noreply.github.com>
提交于

代码差异

1 个文件 +69 -2
Modified other/bvid_desc.md +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 ```