Bilibili bv 号 和 av 号 互转算法,php版

in Share with 0 comment

bv 号 和 av 号 互转

前段时间 Bilibili 已经将 av 号升级为 bv 号了,如 BV1iQ4y1M7EH

算法

github: https://github.com/anhao/bv2av , 欢迎 star

算法参考 :https://www.zhihu.com/question/381784377/answer/1099438784 (这个是 python 版的)

<?php
/**
 * @author : Alone88
 *
 * algorithm:https://www.zhihu.com/question/381784377/answer/1099438784
 *
 * Bilibili AV BV 互转
 *
 * Class Bilibili
 */
class Bilibili
{
    protected $tr = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF";
    protected $xor = 177451812;
    protected $add = 8728348608;
    protected $s = [11, 10, 3, 8, 4, 6];

    /**
     * BV 转 AV
     *
     * @param $bv
     * @return int
     */
    public function dec($bv)
    {
        $r = 0;
        $tr = array_flip(str_split($this->tr));
        for ($i = 0; $i < 6; $i++) {
            $r += $tr[$bv[$this->s[$i]]] * (pow(58, $i));
        }
        return ($r - $this->add) ^ $this->xor;
    }

    /**
     *
     * AV 转 BV
     *
     * @param $av
     * @return string
     */
    public function enc($av)
    {
        $tr = str_split($this->tr);
        $bv = 'BV1  4 1 7  ';
        $av = ($av ^ $this->xor) + $this->add;
        for ($i = 0; $i < 6; $i++) {
            $bv[$this->s[$i]] = $tr[floor($av/pow(58,$i)%58)];
        }
        return $bv;
    }
}
Responses