返回提交历史
Modified
other/bvid_desc.md
+93
-10
XFEstudio/bilibili-API-collect
增加BV AV 互转的Golang 实现 (#480)
* 增加BV AV 互转的Golang 实现 * fix format Co-authored-by: 社会易姐QwQ <45892418+SocialSisterYi@users.noreply.github.com>
9322217
代码差异
1 个文件
+93
-10
@@ -1,27 +1,58 @@
1
1
# bvid说明
2
2
3
2020-03-23 B站推出了全新的稿件视频id“bvid”来接替之前的“avid”,其用法与性质等价于“avid”
3
2020-03-23 B站推出了全新的稿件视频id`bvid`来接替之前的`avid`,其意义与之相同
4
4
5
5
详见:
6
6
7
7
1. [【升级公告】AV号全面升级至BV号(专栏)](https://www.bilibili.com/read/cv5167957)
8
8
2. [【升级公告】AV号全面升级至BV号](https://www.bilibili.com/blackboard/activity-BV-PC.html)
9
9
10
## 格式
10
---
11
12
- [概述](#概述)
13
- [格式](#格式)
14
- [实质](#实质)
15
- [avid发号方式的变化](#avid发号方式的变化)
16
17
- [算法概述](#算法概述)
18
- [av->bv算法](#av->bv算法)
19
- [bv->av算法](#bv->av算法)
20
21
- [编程实现](#编程实现)
22
23
- [Python](#Python)
24
25
- [C](#C)
26
27
- [TypeScript](#TypeScript)
28
29
- [Java](#Java)
30
31
- [Kotlin](#Kotlin)
32
33
- [Golang](#Golang)
34
35
---
36
37
## 概述
38
39
### 格式
11
40
12
41
“bvid”恒为长度为12的字符串,前两个字母为大写“BV”,后10个为base58计算结果
13
42
14
## 实质
43
### 实质
15
44
16
45
“bvid"为“avid”的base58编码,可通过算法进行相互转化
17
46
18
## avid发放方式的变化
47
### avid发号方式的变化
19
48
20
49
从2009-09-09 09:09:09 [av2](https://www.bilibili.com/video/av2)的发布到2020-03-28 19:45:02 [av99999999](https://www.bilibili.com/video/av99999999)的发布B站结束了以投稿时间为顺序的avid发放,改为随机发放avid
21
50
22
51
~~暗示B站东方要完?泪目~~
23
52
24
## av->bv算法
53
## 算法概述
54
55
### av->bv算法
25
56
26
57
注:本算法及示例程序仅能编码及解码avid<` 29460791296 `,无法验证avid>=` 29460791296 `的正确性
27
58
@@ -53,13 +84,13 @@
53
84
54
85
算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)
55
86
56
## bv->av算法
87
### bv->av算法
57
88
58
89
为以上算法的逆运算
59
90
60
## 转换程序
91
## 编程实现
61
92
62
使用Python、C、TypeScript、Java以及Kotlin作为示例,欢迎社区提交更多例程
93
使用Python、C、TypeScript、Java、Kotlin以及Golang作为示例,欢迎社区提交更多例程
63
94
64
95
### Python
65
96
@@ -97,7 +128,7 @@ BV17x411w7KC
97
128
170001
98
129
```
99
130
100
### C语言
131
### C
101
132
102
133
```c
103
134
#include <stdio.h>
@@ -187,8 +218,8 @@ export default class BvCode {
187
218
188
219
const bvcode = new BvCode();
189
220
190
console.log(bvcode.bv2av('BV17x411w7KC'));
191
221
console.log(bvcode.av2bv(170001));
222
console.log(bvcode.bv2av('BV17x411w7KC'));
192
223
```
193
224
194
225
输出为:
@@ -305,3 +336,55 @@ object VideoUtils {
305
336
306
337
}
307
338
```
339
340
### Golang
341
```golang
342
package main
343
344
import "math"
345
346
const TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"
347
348
var S = [11]uint{11, 10, 3, 8, 4, 6}
349
350
const XOR = 177451812
351
const ADD = 8728348608
352
353
var TR = map[string]int64{}
354
355
// 初始化 TR
356
func init() {
357
for i := 0; i < 58; i++ {
358
TR[TABLE[i:i+1]] = int64(i)
359
}
360
}
361
362
func BV2AV(bv string) int64 {
363
r := int64(0)
364
for i := 0; i < 6; i++ {
365
r += TR[bv[S[i]:S[i]+1]] * int64(math.Pow(58, float64(i)))
366
}
367
return (r - ADD) ^ XOR
368
}
369
370
func AV2BV(av int64) string {
371
x := (av ^ XOR) + ADD
372
r := []rune("BV1 4 1 7 ")
373
for i := 0; i < 6; i++ {
374
r[S[i]] = rune(TABLE[x/int64(math.Pow(58, float64(i)))%58])
375
}
376
return string(r)
377
}
378
379
func main() {
380
println(AV2BV(170001))
381
println(BV2AV("BV17x411w7KC"))
382
}
383
```
384
385
输出为:
386
387
```
388
BV17x411w7KC
389
170001
390
```