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

XFEstudio/bilibili-API-collect

增加BV AV 互转的Golang 实现 (#480)

* 增加BV AV 互转的Golang 实现 * fix format Co-authored-by: 社会易姐QwQ <45892418+SocialSisterYi@users.noreply.github.com>

9322217
一心向晚 <loveava0612@outlook.com>
提交于

代码差异

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