美文网首页PHP经验分享
base58 编码、解码

base58 编码、解码

作者: Dorm_Script | 来源:发表于2018-07-25 10:25 被阅读5次

    字符串编码流程

    • 将字符串的每个字节换算成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
    
    $encode = base58_encode('ABD');
    echo "\n".$encode;
    
    $decode = base58_decode($encode);
    echo "\n".$decode;
    
    function base58_encode($string)
    {
        $alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
        $base = strlen($alphabet);
    
        if (is_string($string) === false || !strlen($string)) {
            return false;
        }
    
        $bytes = array_values(unpack('C*', $string));
        $decimal = $bytes[0];
        for ($i = 1, $l = count($bytes); $i < $l; ++$i) {
            $decimal = bcmul($decimal, 256);
            $decimal = bcadd($decimal, $bytes[$i]);
        }
    
        $output = '';
        while ($decimal >= $base) {
            $div = bcdiv($decimal, $base, 0);
            $mod = bcmod($decimal, $base);
            $output .= $alphabet[$mod];
            $decimal = $div;
        }
        if ($decimal > 0) {
            $output .= $alphabet[$decimal];
        }
        $output = strrev($output);
    
        return (string) $output;
    }
    
    function base58_decode($base58)
    {
        $alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
        $base = strlen($alphabet);
    
        if (is_string($base58) === false || !strlen($base58)) {
            return false;
        }
        $indexes = array_flip(str_split($alphabet));
        $chars = str_split($base58);
        foreach ($chars as $char) {
            if (isset($indexes[$char]) === false) {
                return false;
            }
        }
        $decimal = $indexes[$chars[0]];
        for ($i = 1, $l = count($chars); $i < $l; ++$i) {
            $decimal = bcmul($decimal, $base);
            $decimal = bcadd($decimal, $indexes[$chars[$i]]);
        }
        $output = '';
        while ($decimal > 0) {
            $byte = bcmod($decimal, 256);
            $output = pack('C', $byte).$output;
            $decimal = bcdiv($decimal, 256, 0);
        }
        return $output;
    }
    
    

    相关文章

      网友评论

        本文标题:base58 编码、解码

        本文链接:https://www.haomeiwen.com/subject/mwzumftx.html