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

XFEstudio/bilibili-API-collect

fix(docs/other/bvid_desc.md) (#663)

06e8343
zine_yu <46991452+zine0@users.noreply.github.com>
提交于

代码差异

1 个文件 +64 -39
Modified docs/other/bvid_desc.md +64 -39
@@ -25,13 +25,15 @@
25 25
26 26 ## 算法概述
27 27
28 算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)
28 ~~算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)~~
29 实际上该算法并不完整,新的算法参考自[【揭秘】av号转bv号的过程](https://www.bilibili.com/video/BV1N741127Tj)
29 30
30 31 ### av->bv算法
31 32
32 33 注:本算法及示例程序仅能编解码`avid < 29460791296`,且暂无法验证`avid >= 29460791296`的正确性
34 再注:本人不清楚新算法能否编解码`avid >= 29460791296`
33 35
34 1. a = (avid ⊕ 177451812) + 8728348608
36 1. a = (avid ⊕ 177451812) + 100618342136696320
35 37 2. 以 i 为循环变量循环 6 次 b[i] = (a / 58 ^ i) % 58
36 38 3. 将 b[i] 中各个数字转换为以下码表中的字符
37 39
@@ -39,23 +41,31 @@
39 41
40 42 > fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF
41 43
42 4. 初始化字符串 b[i]=`BV1 4 1 7 `
44 4. 初始化字符串 b[i]=` `
43 45
44 46 5. 按照以下字符顺序编码表编码并填充至 b[i]
45 47
46 48 字符顺序编码表:
47 49
48 > 0 -> 11
50 > 0 -> 9
49 51 >
50 > 1 -> 10
52 > 1 -> 8
51 53 >
52 > 2 -> 3
54 > 2 -> 1
53 55 >
54 > 3 -> 8
56 > 3 -> 6
55 57 >
56 > 4 -> 4
58 > 4 -> 2
57 59 >
58 > 5 -> 6
60 > 5 -> 4
61 >
62 > 6 -> 0
63 >
64 > 7 -> 7
65 >
66 > 8 -> 3
67 >
68 > 9 -> 5
59 69
60 70
61 71 ### bv->av算法
@@ -66,41 +76,56 @@
66 76
67 77 使用 Python、C、TypeScript、Java、Kotlin 以及 Golang 等语言作为示例,欢迎社区提交更多例程
68 78
79 注: 新算法只提供了Python版本
69 80 ### Python
70 81
71 82 ```python
72 table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF' # 码表
73 tr = {} # 反查码表
74 # 初始化反查码表
75 for i in range(58):
76 tr[table[i]] = i
77 s = [11, 10, 3, 8, 4, 6] # 位置编码表
78 XOR = 177451812 # 固定异或值
79 ADD = 8728348608 # 固定加法值
80
81 def bv2av(x):
82 r = 0
83 for i in range(6):
84 r += tr[x[s[i]]] * 58 ** i
85 return (r - ADD) ^ XOR
86
87 def av2bv(x):
88 x = (x ^ XOR) + ADD
89 r = list('BV1 4 1 7 ')
90 for i in range(6):
91 r[s[i]] = table[x // 58 ** i % 58]
92 return ''. join(r)
93
94 print(av2bv(170001))
95 print(bv2av('BV17x411w7KC'))
83 XOR = 177451812
84 ADD = 100618342136696320
85 TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"
86 MAP = {
87 0:9,
88 1:8,
89 2:1,
90 3:6,
91 4:2,
92 5:4,
93 6:0,
94 7:7,
95 8:3,
96 9:5
97 }
98 def av2bv(av):
99 av = (av ^ XOR) + ADD
100 bv = [""]*10
101 for i in range(10):
102 bv[MAP[i]] = TABLE[(av//58**i)%58]
103 return "".join(bv)
104
105 def bv2av(bv):
106 av = [""]*10
107 s = 0
108 for i in range(10):
109 s += TABLE.find(bv[MAP[i]])*58**i
110 av=(s-ADD)^XOR
111
112 return(av)
113
114 def main():
115 while True:
116 mod = input("1.AV2BV\n2.BV2AV\n3.Exit\n你的选择:")
117 if mod == "1":
118 print("BV号是: BV"+av2bv(int(input("AV号是:"))))
119 elif mod == "2":
120 print("AV号是 AV"+str(bv2av(input("BV号是"))))
121 elif mod == "3":
122 break
123 else:
124 print("输入错误请重新输入")
125
126 main()
96 127 ```
97 128
98 输出为:
99
100 ```
101 BV17x411w7KC
102 170001
103 ```
104 129
105 130 ### C
106 131