2021-07-12 21:31:27 +08:00
|
|
|
|
# bvid说明
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
2020-03-23 B站推出了全新的稿件视频id“bvid”来接替之前的“avid”,其用法与性质等价于“avid”
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
|
|
|
|
详见:
|
|
|
|
|
|
|
|
|
|
1. [【升级公告】AV号全面升级至BV号(专栏)](https://www.bilibili.com/read/cv5167957)
|
|
|
|
|
2. [【升级公告】AV号全面升级至BV号](https://www.bilibili.com/blackboard/activity-BV-PC.html)
|
|
|
|
|
|
|
|
|
|
## 格式:
|
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
“bvid”恒为长度为12的字符串,前两个字母为大写“BV”,后10个位base58计算结果
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
|
|
|
|
## 实质:
|
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
“bvid"为“avid”的base58编码,可通过算法进行相互转化
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
## avid发放方式的变化:
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
从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
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
|
|
|
|
~~暗示B站东方要完?泪目~~
|
|
|
|
|
|
|
|
|
|
## av->bv算法:
|
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
注:本算法及示例程序仅能编码及解码avid<` 29460791296 `,无法验证avid>=` 29460791296 `的正确性
|
2020-10-23 18:53:01 +08:00
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
1. a=(avid⊕177451812)+8728348608
|
2020-10-23 18:53:01 +08:00
|
|
|
|
2. 以i为循环变量循环6次b[i]=(a/58^i)%58
|
2020-10-11 15:41:50 +08:00
|
|
|
|
3. 将b[i]中各个数字转换为以下码表中的字符
|
|
|
|
|
|
|
|
|
|
码表:
|
|
|
|
|
|
|
|
|
|
> fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF
|
|
|
|
|
|
2020-10-23 18:53:01 +08:00
|
|
|
|
4. 初始化字符串b[i]=`BV1 4 1 7 `
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
2020-10-23 18:53:01 +08:00
|
|
|
|
5. 按照以下字符顺序编码表编码并填充至b[i]
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
2020-10-23 18:53:01 +08:00
|
|
|
|
字符顺序编码表:
|
|
|
|
|
|
|
|
|
|
> 0 -> 11
|
2020-10-11 15:41:50 +08:00
|
|
|
|
>
|
2020-10-23 18:53:01 +08:00
|
|
|
|
> 1 -> 10
|
2020-10-11 15:41:50 +08:00
|
|
|
|
>
|
2020-10-23 18:53:01 +08:00
|
|
|
|
> 2 -> 3
|
2020-10-11 15:41:50 +08:00
|
|
|
|
>
|
2020-10-23 18:53:01 +08:00
|
|
|
|
> 3 -> 8
|
2020-10-11 15:41:50 +08:00
|
|
|
|
>
|
2020-10-23 18:53:01 +08:00
|
|
|
|
> 4 -> 4
|
2020-10-11 15:41:50 +08:00
|
|
|
|
>
|
2020-10-23 18:53:01 +08:00
|
|
|
|
> 5 -> 6
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
2020-10-23 18:53:01 +08:00
|
|
|
|
算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
|
|
|
|
## bv->av算法:
|
|
|
|
|
|
|
|
|
|
为以上算法的逆运算
|
|
|
|
|
|
|
|
|
|
## 转换程序:
|
|
|
|
|
|
2020-10-23 18:53:01 +08:00
|
|
|
|
目前使用**Python**与**C**作为示例
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
|
|
|
|
### python
|
|
|
|
|
|
|
|
|
|
```python
|
2020-10-23 18:53:01 +08:00
|
|
|
|
table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF' #码表
|
|
|
|
|
tr = {} #反查码表
|
|
|
|
|
#初始化反查码表
|
2020-10-11 15:41:50 +08:00
|
|
|
|
for i in range(58):
|
|
|
|
|
tr[table[i]] = i
|
2020-10-23 18:53:01 +08:00
|
|
|
|
s = [11, 10, 3, 8, 4, 6] #位置编码表
|
|
|
|
|
xor = 177451812 #固定异或值
|
|
|
|
|
add = 8728348608 #固定加法值
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
|
|
|
|
def bv2av(x):
|
|
|
|
|
r = 0
|
2020-10-23 18:53:01 +08:00
|
|
|
|
for i in range(6):
|
2020-10-11 15:41:50 +08:00
|
|
|
|
r += tr[x[s[i]]] * 58 ** i
|
|
|
|
|
return (r - add) ^ xor
|
|
|
|
|
|
|
|
|
|
def av2bv(x):
|
|
|
|
|
x = (x ^ xor) + add
|
2020-10-23 18:53:01 +08:00
|
|
|
|
r = list('BV1 4 1 7 ')
|
|
|
|
|
for i in range(6):
|
2020-10-11 15:41:50 +08:00
|
|
|
|
r[s[i]] = table[x // 58 ** i % 58]
|
|
|
|
|
return ''. join(r)
|
|
|
|
|
|
|
|
|
|
print(av2bv(170001))
|
|
|
|
|
print(bv2av('BV17x411w7KC'))
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
输出为:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
BV17x411w7KC
|
|
|
|
|
170001
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### C语言
|
|
|
|
|
|
|
|
|
|
```c
|
|
|
|
|
#include <stdio.h>
|
2020-12-29 11:15:37 +08:00
|
|
|
|
#include <stdlib.h>
|
2020-10-11 15:41:50 +08:00
|
|
|
|
#include <math.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
const char table[] = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; //码表
|
|
|
|
|
char tr[124]; //反查码表
|
|
|
|
|
const unsigned long long Xor = 177451812; //固定异或值
|
2020-10-23 18:53:01 +08:00
|
|
|
|
const unsigned long long add = 8728348608; //固定加法值
|
|
|
|
|
const int s[] = {11, 10, 3, 8, 4, 6}; //位置编码表
|
2020-10-11 15:41:50 +08:00
|
|
|
|
|
2020-10-23 18:53:01 +08:00
|
|
|
|
//初始化反查码表
|
2021-07-12 21:31:27 +08:00
|
|
|
|
void tr_init() {
|
2020-10-11 15:41:50 +08:00
|
|
|
|
for (int i = 0; i < 58; i++)
|
|
|
|
|
tr[table[i]] = i;
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
unsigned long long bv2av(char bv[]) {
|
2020-10-11 15:41:50 +08:00
|
|
|
|
unsigned long long r = 0;
|
|
|
|
|
unsigned long long av;
|
2020-10-23 18:53:01 +08:00
|
|
|
|
for (int i = 0; i < 6; i++)
|
2020-10-11 15:41:50 +08:00
|
|
|
|
r += tr[bv[s[i]]] * (unsigned long long)pow(58, i);
|
|
|
|
|
av = (r - add) ^ Xor;
|
|
|
|
|
return av;
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
char* av2bv(unsigned long long av) {
|
2020-12-29 11:15:37 +08:00
|
|
|
|
char* result = (char*)malloc(13);
|
2020-10-23 18:53:01 +08:00
|
|
|
|
strcpy(result,"BV1 4 1 7 ");
|
2020-10-11 15:41:50 +08:00
|
|
|
|
av = (av ^ Xor) + add;
|
2020-10-23 18:53:01 +08:00
|
|
|
|
for (int i = 0; i < 6; i++)
|
2020-10-11 15:41:50 +08:00
|
|
|
|
result[s[i]] = table[(unsigned long long)(av / (unsigned long long)pow(58, i)) % 58];
|
2020-12-29 11:15:37 +08:00
|
|
|
|
return result;
|
2020-10-11 15:41:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-07-12 21:31:27 +08:00
|
|
|
|
int main() {
|
2020-10-11 15:46:44 +08:00
|
|
|
|
tr_init();
|
|
|
|
|
printf("%s\n",av2bv(170001));
|
2020-10-11 15:41:50 +08:00
|
|
|
|
printf("%u\n",bv2av("BV17x411w7KC"));
|
2020-10-11 15:46:44 +08:00
|
|
|
|
return 0;
|
2020-10-11 15:41:50 +08:00
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
输出为:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
BV17x411w7KC
|
|
|
|
|
170001
|
|
|
|
|
```
|