字符串編碼流程
- 將字符串的每個字節換算成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;
}