BV 转 AV
引言
许久之前从知乎上看到的算法,如何看待 2020 年 3 月 23 日哔哩哔哩将稿件的「av 号」变更为「BV 号」?,现在使用 TypeScript 重写了一遍。现在似乎新的 BV 号已经无法转换了,也就是 AV 消失的这一天已经来了。
转换为 AV 号:
转换为 BV 号:
代码如下:
ts
const table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
const tr = []
for (let i = 0; i < 58; i++) {
tr[table[i]] = i
}
const s = [11, 10, 3, 8, 4, 6]
const xor = 177451812
const add = 8728348608
/**
* BV 转 AV
*/
export function dec(bv: string): number {
let r = 0
for (let i = 0; i < 6; i++) {
r += tr[bv[s[i]]] * 58 ** i
}
return (r - add) ^ xor
}
/**
* AV 转 BV
*/
export function enc(av: string): string {
let x = Number.parseInt(av.replace(/^av/i, ''))
x = (x ^ xor) + add
const r = ['B', 'V', '1', ' ', ' ', '4', ' ', '1', ' ', '7', ' ', ' ']
for (let i = 0; i < 6; i++) {
r[s[i]] = table[Math.floor(x / 58 ** i) % 58]
}
return r.join('')
}