zoukankan      html  css  js  c++  java
  • 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 "
     转码:" . $encode;
    
    $decode = base58_decode($encode);
    echo "
     解码:" . $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;
    }
    
    
  • 相关阅读:
    Android中GC_EXTERNAL_ALLOC的含义
    Phonegap开发的前后台数据交互
    代码管理工具TortoiseSVN
    14款响应式前端开发框架
    简化工作流程,10款必备的HTML5开发工具
    [C#.net]处理UTF-8文件乱码
    [Oracle]ORA-14400:插入的分区关键字未映射到任何分区
    [网络]10M、100M、1000M网线的水晶头接法
    [Office]Execl取消保护密码
    SLI的相关学习
  • 原文地址:https://www.cnblogs.com/dormscript/p/15088266.html
Copyright © 2011-2022 走看看