摩斯电码加密解密demo

<?phpnamespace common\helpers;/** * 摩斯明码加密解密 * * @author wangjian * @since 0.1 */class Morse{    /**     * @var array 摩斯默认配置     */    protected static $option = [        'space'=> '/',        'short'=> '.',        'long'=> '-'    ];    /**     * @var array 摩斯明码转换     */    protected static $standard = [        'A' => '01',        'B' => '1000',        'C' => '1010',        'D' => '100',        'E' => '0',        'F' => '0010',        'G' => '110',        'H' => '0000',        'I' => '00',        'J' => '0111',        'K' => '101',        'L' => '0100',        'M' => '11',        'N' => '10',        'O' => '111',        'P' => '0110',        'Q' => '1101',        'R' => '010',        'S' => '000',        'T' => '1',        'U' => '001',        'V' => '0001',        'W' => '011',        'X' => '1001',        'Y' => '1011',        'Z' => '1100',        '0' => '11111',        '1' => '01111',        '2' => '00111',        '3' => '00011',        '4' => '00001',        '5' => '00000',        '6' => '10000',        '7' => '11000',        '8' => '11100',        '9' => '11110',        '.' => '010101',        ',' => '110011',        '?' => '001100',        '\'' => '011110',        '!' => '101011',        '/' => '10010',        '(' => '10110',        ')' => '101101',        '&' => '01000',        ' =>' => '111000',        ';' => '101010',        '=' => '10001',        '+' => '01010',        '-' => '100001',        '_' => '001101',        '"' => '010010',        '$' => '0001001',        '@' => '011010',    ];    /**     * @var null 莫斯转换后果     */    protected static $standardReverse = null;    /**     * 默认参数配置     */    protected static function defaultOption($option = null )    {        $option = $option || [];        return [            isset($option['space']) ? $option['space'] : self::$option['space'],            isset($option['short']) ? $option['short'] : self::$option['short'],            isset($option['long']) ? $option['long'] : self::$option['long']        ];    }    /**     * 按utf宰割字符串     */    protected static function mbStrSplit($str)    {        $len = 1;        $start = 0;        $strlen = mb_strlen($str);        while ($strlen)        {            $array[] = mb_substr($str,$start,$len,"utf8");            $str = mb_substr($str, $len, $strlen,"utf8");            $strlen = mb_strlen($str);        }        return $array;    }    /**     * Unicode字符转换成utf8字符     */    protected static function unicodeToUtf8($unicode_str)    {        $utf8_str = '';        $code = intval(hexdec($unicode_str));        //这里留神转换进去的code肯定得是整形,这样才会正确的按位操作        $ord_1 = decbin(0xe0 | ($code >> 12));        $ord_2 = decbin(0x80 | (($code >> 6) & 0x3f));        $ord_3 = decbin(0x80 | ($code & 0x3f));        $utf8_str = chr(bindec($ord_1)) . chr(bindec($ord_2)) . chr(bindec($ord_3));        return $utf8_str;    }    protected static function charCodeAt($str, $index)    {        $char = mb_substr($str, $index, 1, 'UTF-8');        if (mb_check_encoding($char, 'UTF-8')) {            $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');            return hexdec(bin2hex($ret));        }        else {            return null;        }    }    /**     * 摩斯码转文本     */    protected static function morseHexUnicode($mor)    {        $mor = bindec($mor);        if(!$mor) {            return '';        } else {            $mor = dechex ($mor);        }        return self::unicodeToUtf8($mor);    }    /**     * unicode转二进制     */    public static function unicodeHexMorse($ch)    {        $r = [];        $length = mb_strlen($ch, 'UTF8');        for($i = 0; $i < $length; $i++) {            $r[$i] = substr(('00'. dechex(self::charCodeAt($ch,$i))), -4);        }        $r = join('',$r);        return base_convert (hexdec($r), 10, 2);    }    /**     * 加密摩斯电码     */    public static function encode($text, $option = null)    {        $option = self::defaultOption($option); // 默认参数        $morse = []; // 最终的 morse 后果        //删除空格,转大写,宰割为数组        $text = self::mbStrSplit( strtoupper(str_replace(' ', '', $text)));        foreach($text as $key => $ch) {            $r = @self::$standard[$ch];            if(!$r) {                $r = self::unicodeHexMorse($ch); // 找不到,阐明是非规范的字符,应用 unicode。            }            $morse[] = str_replace('1', $option[2], str_replace('0', $option[1], $r));        }        return join( $option[0], $morse);    }    /**     * 解密摩斯电码     */    public static function decode($morse, $option = null)    {        if( self::$standardReverse === null) {            foreach(self::$standard as $key => $value) {                self::$standardReverse[$value] = $key;            }        }        $option = self::defaultOption($option);        $msg = [];        $morse = explode($option[0], $morse); // 宰割为数组        foreach($morse as $key =>$mor) {            $mor = str_replace(' ', '', $mor);            $mor = str_replace($option[2], '1', str_replace( $option[1], '0', $mor));            $r = @self::$standardReverse[$mor];            if(!$r) {                $r = self::morseHexUnicode($mor); // 找不到,阐明是非规范字符的 morse,应用 unicode 解析形式。            }            $msg[] = $r;        }        return join( '', $msg);    }}

摩斯电码加密:

$txt = ''//须要加密的字符$morse = Morse::encode($txt);

摩斯电码解密:

$morse = ''//须要解密的摩斯电码$morse = Morse::decode($morse);

实例如下:

$txt = '测试';$morse = Morse::encode($txt);echo $morse . "<br/>";$txt = Morse::decode($morse);echo $txt;

输出后果如下: