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

Stella981
• 阅读 601

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

参考

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
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
可莉 可莉
3年前
2021 最顶级 React 组件库推荐
点上方蓝字关注公众号「前端从进阶到入院」作者丨MaxRozen译者丨王强策划丨小智AntDesign!(https://oscimg.oschina.net/oscnet/a85c35f23bd04e5da6a1e5e68a24119b.png)项目链接:AntDesignh
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
HEVC和AV1幕后视频编解码器之战
!(https://oscimg.oschina.net/oscnet/4c67bcb396c74b35a3a13b31cf58892b.jpg)在未来几天的NAB大会上,AOM联盟将展示AV1的性能,多媒体行业全部聚焦于HEVC与AV1比较上。这是AV1于3月底完成1.0版定稿(https://www.oschina.net
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这