根據字典,轉成相應的進位制

小李世界發表於2021-11-19

改自 部落格:短連結生成專案,歡迎各位大佬PR

進行了:

  • 變數唯一
  • PHP 8 風格註釋
  • 長語句改為短語句並進行註釋

做為備忘?

<?php

class Test
{
    public string $map = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    // $map 的長度
    public string $mapLen = '62';

    /**
     * 根據字典,轉成相應的進位制
     *
     * @param  string  $number 數字
     * @return string
     */
    public function hexTo(string $number): string
    {
        $string = '';

        do {
            $mod = (int) bcmod($number, $this->mapLen);
            $string = $this->map[$mod].$string;
            $number = bcdiv($number, $this->mapLen);
        } while ($number > 0);

        return $string;
    }

    /**
     * 根據字典,轉成十進位制
     *
     * @param  string  $string 字串
     * @return int
     */
    public function toDecimal(string $string): int {
        $number = 0;
        $strLen = strlen($string);

        for ($i = 0; $i < $strLen; $i++) {
            $position = strpos($this->map, $string[$i]);
            // 根據當前位數,字元轉十進位制
            $charToDecimal = bcmul(bcpow($this->mapLen, $strLen - $i - 1), $position);
            // 每個字元累加
            $number = bcadd($charToDecimal, $number);
        }

        return $number;
    }
}

$test = new Test;

echo $test->hexTo(61);
// Z

echo $test->toDecimal('Z');
// 61
本作品採用《CC 協議》,轉載必須註明作者和本文連結
無論在現實或是網路中,我都是孤獨的。

相關文章