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

XFEstudio/bilibili-API-collect

add bv2av typescript demo

ebe09ba
社会易姐QwQ <45892418+SocialSisterYi@users.noreply.github.com>
提交于

代码差异

1 个文件 +75 -27
Modified other/bvid_desc.md +75 -27
@@ -7,21 +7,21 @@
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 11
12 12 “bvid”恒为长度为12的字符串,前两个字母为大写“BV”,后10个位base58计算结果
13 13
14 ## 实质:
14 ## 实质
15 15
16 16 “bvid"为“avid”的base58编码,可通过算法进行相互转化
17 17
18 ## avid发放方式的变化:
18 ## avid发放方式的变化
19 19
20 20 从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 21
22 22 ~~暗示B站东方要完?泪目~~
23 23
24 ## av->bv算法:
24 ## av->bv算法
25 25
26 26 注:本算法及示例程序仅能编码及解码avid<` 29460791296 `,无法验证avid>=` 29460791296 `的正确性
27 27
@@ -53,34 +53,34 @@
53 53
54 54 算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)
55 55
56 ## bv->av算法:
56 ## bv->av算法
57 57
58 58 为以上算法的逆运算
59 59
60 ## 转换程序:
60 ## 转换程序
61 61
62 目前使用**Python**与**C**作为示例
62 使用Python、C以及TypeScript作为示例,欢迎社区提交更多例程
63 63
64 64 ### python
65 65
66 66 ```python
67 table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF' #码表
68 tr = {} #反查码表
69 #初始化反查码表
67 table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF' # 码表
68 tr = {} # 反查码表
69 # 初始化反查码表
70 70 for i in range(58):
71 71 tr[table[i]] = i
72 s = [11, 10, 3, 8, 4, 6] #位置编码表
73 xor = 177451812 #固定异或值
74 add = 8728348608 #固定加法值
72 s = [11, 10, 3, 8, 4, 6] # 位置编码表
73 XOR = 177451812 # 固定异或值
74 ADD = 8728348608 # 固定加法值
75 75
76 76 def bv2av(x):
77 77 r = 0
78 78 for i in range(6):
79 79 r += tr[x[s[i]]] * 58 ** i
80 return (r - add) ^ xor
80 return (r - ADD) ^ XOR
81 81
82 82 def av2bv(x):
83 x = (x ^ xor) + add
83 x = (x ^ XOR) + ADD
84 84 r = list('BV1 4 1 7 ')
85 85 for i in range(6):
86 86 r[s[i]] = table[x // 58 ** i % 58]
@@ -105,13 +105,13 @@ BV17x411w7KC
105 105 #include <math.h>
106 106 #include <string.h>
107 107
108 const char table[] = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; //码表
109 char tr[124]; //反查码表
110 const unsigned long long Xor = 177451812; //固定异或值
111 const unsigned long long add = 8728348608; //固定加法值
112 const int s[] = {11, 10, 3, 8, 4, 6}; //位置编码表
108 const char table[] = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; // 码表
109 char tr[124]; // 反查码表
110 const unsigned long long XOR = 177451812; // 固定异或值
111 const unsigned long long ADD = 8728348608; // 固定加法值
112 const int s[] = {11, 10, 3, 8, 4, 6}; // 位置编码表
113 113
114 //初始化反查码表
114 // 初始化反查码表
115 115 void tr_init() {
116 116 for (int i = 0; i < 58; i++)
117 117 tr[table[i]] = i;
@@ -122,14 +122,14 @@ unsigned long long bv2av(char bv[]) {
122 122 unsigned long long av;
123 123 for (int i = 0; i < 6; i++)
124 124 r += tr[bv[s[i]]] * (unsigned long long)pow(58, i);
125 av = (r - add) ^ Xor;
125 av = (r - ADD) ^ XOR;
126 126 return av;
127 127 }
128 128
129 char* av2bv(unsigned long long av) {
130 char* result = (char*)malloc(13);
129 char *av2bv(unsigned long long av) {
130 char *result = (char*)malloc(13);
131 131 strcpy(result,"BV1 4 1 7 ");
132 av = (av ^ Xor) + add;
132 av = (av ^ XOR) + ADD;
133 133 for (int i = 0; i < 6; i++)
134 134 result[s[i]] = table[(unsigned long long)(av / (unsigned long long)pow(58, i)) % 58];
135 135 return result;
@@ -137,8 +137,8 @@ char* av2bv(unsigned long long av) {
137 137
138 138 int main() {
139 139 tr_init();
140 printf("%s\n",av2bv(170001));
141 printf("%u\n",bv2av("BV17x411w7KC"));
140 printf("%s\n", av2bv(170001));
141 printf("%u\n", bv2av("BV17x411w7KC"));
142 142 return 0;
143 143 }
144 144 ```
@@ -149,3 +149,51 @@ int main() {
149 149 BV17x411w7KC
150 150 170001
151 151 ```
152
153 ### TypeScript
154
155 感谢[#417](https://github.com/SocialSisterYi/bilibili-API-collect/issues/417#issuecomment-1186475063)提供
156
157 ```typescript
158 export default class BvCode {
159 private TABEL = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'; // 码表
160 private TR: Record<string, number> = {}; // 反查码表
161 private S = [11, 10, 3, 8, 4, 6]; // 位置编码表
162 private XOR = 177451812; // 固定异或值
163 private ADD = 8728348608; // 固定加法值
164 constructor() {
165 // 初始化反查码表
166 const len = this.TABEL.length;
167 for (let i = 0; i < len; i++) {
168 this.TR[this.TABEL[i]] = i;
169 }
170 }
171 av2bv(av: number): string {
172 const x_ = (av ^ this.XOR) + this.ADD;
173 const r = ['B', 'V', '1', , , '4', , '1', , '7'];
174 for (let i = 0; i < 6; i++) {
175 r[this.S[i]] = this.TABEL[Math.floor(x_ / 58 ** i) % 58];
176 }
177 return r.join('');
178 }
179 bv2av(bv: string): number {
180 let r = 0;
181 for (let i = 0; i < 6; i++) {
182 r += this.TR[bv[this.S[i]]] * 58 ** i;
183 }
184 return (r - this.ADD) ^ this.XOR;
185 }
186 }
187
188 const bvcode = new BvCode();
189
190 console.log(bvcode.bv2av('BV17x411w7KC'));
191 console.log(bvcode.av2bv(170001));
192 ```
193
194 输出为:
195
196 ```
197 BV17x411w7KC
198 170001
199 ```