base58 編碼、解碼


字符串編碼流程

  • 將字符串的每個字節換算成ASCII(0-255) (字符串實際上就是256進制的數字組合)
    • 源字符串為:ABD
    • 換算后: 65 66 68
  • 將256進制的數字轉換成10進制數字
    • 256進制數:65 66 68
    • 轉成10進制:(65 * 256 + 66) * 256 + 68 = 4276804
  • 將10進制數字轉換成58進制數字
    • 10進制數:4276804
    • 58進制數: 21 53 20 0
  • 將58進制數字的每一位按照表格轉換成對應的字符
    • 58進制數:21 53 20 0
    • 碼表:123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ
    • 轉換后的字符:nVm1

字符串解碼流程

  • 字符串每一位按碼表替換成數字 (58進制)
    • 源字符: nVm1
    • 58進制數:21 53 20 0
  • 58進制轉10進制
    • 58進制數:21 53 20 0
    • 10進制數:4276804
  • 10進制轉256進制
    • 10進制數:4276804
    • 256進制: 65 66 68
  • 256進制轉字符(按ascii轉)
    • 256進制: 65 66 68
    • 字符:ABD

總結:

  • 編碼流程:將ascii編碼的字符串(256進制),轉換成58進制。然后按照58進制的碼表轉換成相應的字符。
  • 解碼流程:按碼表把字符轉成58進制數字,再轉256進制,按ascii把256進制數字轉字符

注:任意進制之間的轉換,先將數字轉10進制再轉其它進制

附:php代碼一份

<?php

$num    = 9999;
$encode = base58_encode($num);
echo "\n 轉碼:" . $encode;

$decode = base58_decode($encode);
echo "\n 解碼:" . $decode;

// 將數字壓縮
function base58_encode($decimal)
{
    $alphabet = 'EofdCnw9sRZmjuLcHDBJeArW5FhxaYp64zVvMgTN1PX2yqU3kiSG78tKQb'; // 隨機字符
    $base     = strlen($alphabet);
    $output   = '';
    if (!is_numeric($decimal)) {
        return $output;
    }
    while ($decimal >= $base) {
        $div = bcdiv($decimal, $base, 0);
        $mod = bcmod($decimal, $base);
        $output .= $alphabet[$mod];
        $decimal = $div;
    }
    if ($decimal > 0) {
        $output .= $alphabet[$decimal];
    }
    return strrev($output);
}

// 字符串轉成數字
function base58_decode($base58)
{
    $alphabet = 'EofdCnw9sRZmjuLcHDBJeArW5FhxaYp64zVvMgTN1PX2yqU3kiSG78tKQb'; // 同加密一樣的字符
    $base     = strlen($alphabet);
    $indexes  = array_flip(str_split($alphabet));

    $decimal = 0;
    for ($i = 0; $i < strlen($base58); $i++) {
        $decimal = bcmul($decimal, $base);
        $decimal = bcadd($decimal, $indexes[$base58[$i]]);
    }
    return $decimal;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM