返回提交历史
Modified
docs/other/bvid_desc.md
+64
-39
XFEstudio/bilibili-API-collect
fix(docs/other/bvid_desc.md) (#663)
06e8343
代码差异
1 个文件
+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