B站 av和bv号互转 py和js版 bigint

原文链接: B站 av和bv号互转 py和js版 bigint

上一篇: SharedWorker 共享worker数据

下一篇: cheerio 爬取 B站 视频热门视频的bv号

参考

https://www.zhihu.com/question/381784377/answer/1099438784

py的可以直接使用

table='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
tr={}
for i in range(58):
	tr[table[i]]=i
s=[11,10,3,8,4,6]
xor=177451812
add=8728348608

def dec(x):
	r=0
	for i in range(6):
		r+=tr[x[s[i]]]*58**i
	return (r-add)^xor

def enc(x):
	x=(x^xor)+add
	r=list('BV1  4 1 7  ')
	for i in range(6):
		r[s[i]]=table[x//58**i%58]
	return ''.join(r)

print(dec('BV17x411w7KC')) # 170001
print(dec('BV1Q541167Qg')) # 455017605
print(dec('BV1mK4y1C7Bz')) # 882584971
print(enc(170001)) # BV17x411w7KC
print(enc(455017605)) # BV1Q541167Qg
print(enc(882584971)) # BV1mK4y1C7Bz

js版的需要做一些修改, 主要是使用bigint做计算, 因为其中涉及的数值计算太大了, 普通的会溢出

const table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'

const tr = table.split('').reduce(
  (pre, v, i) => {
    pre[table[i]] = BigInt(i)
    return pre
  }, []
)

let s = [11, 10, 3, 8, 4, 6].map(i => BigInt(i))
let xor = BigInt(177451812);
let add = BigInt(8728348608)
const NUM_58 = BigInt(58)

function dec(x) {
  let r = BigInt(0);
  for (let i = 0; i < 6; i++) {
    r += tr[x[s[i]]] * NUM_58 ** BigInt(i);
  }
  let res = (r - add) ^ xor
  return res.toString();
}


function enc(x) {
  x = BigInt(x)
  x = (x ^ xor) + add
  let r = 'BV1  4 1 7  '.split('')
  for (let i = 0; i < 6; i++) {
    r[s[i]] = table [x / NUM_58 ** BigInt(i) % NUM_58]
  }
  return r.join('')
}


console.log(dec('BV17x411w7KC')) // 170001
console.log(dec('BV1Q541167Qg')) // 455017605
console.log(dec('BV1mK4y1C7Bz')) // 882584971
console.log(enc(170001)) // BV17x411w7KC
console.log(enc(455017605)) // BV1Q541167Qg
console.log(enc(882584971)) // BV1mK4y1C7Bz
console.log(enc(498566183)) // BV1AK411W7wq
console.log(dec('BV1Ft4y197pr')) // 626046351

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值