10进制和64进制互转
class jinzhi {
const KeyCode = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$';
/**
* 将64进制的数字字符串转为10进制的数字字符串
* @param $m string 64进制的数字字符串
* @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
* @return string
* @author 野马
*/
public function hex64to10($m, $len = 0) {
$m = (string)$m;
$hex2 = '';
$Code = self::KeyCode;
for($i = 0, $l = strlen($Code); $i < $l; $i++) {
$KeyCode[] = $Code[$i];
}
$KeyCode = array_flip($KeyCode);
for($i = 0, $l = strlen($m); $i < $l; $i++) {
$one = $m[$i];
$hex2 .= str_pad(decbin($KeyCode[$one]), 6, '0', STR_PAD_LEFT);
}
$return = bindec($hex2);
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', STR_PAD_LEFT);
}
}
return $return;
}
/**
* 将10进制的数字字符串转为64进制的数字字符串
* @param $m string 10进制的数字字符串
* @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
* @return string
* @author 野马
*/
public function hex10to64($m, $len = 0) {
$KeyCode = self::KeyCode;
$hex2 = decbin($m);
$hex2 = $this->str_rsplit($hex2, 6);
$hex64 = array();
foreach($hex2 as $one) {
$t = bindec($one);
$hex64[] = $KeyCode[$t];
}
$return = preg_replace('/^0*/', '', implode('', $hex64));
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', STR_PAD_LEFT);
}
}
return $return;
}
/**
* 将16进制的数字字符串转为64进制的数字字符串
* @param $m string 16进制的数字字符串
* @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
* @return string
* @author 野马
*/
protected function hex16to64($m, $len = 0) {
$KeyCode = self::KeyCode;
$hex2 = array();
for($i = 0, $j = strlen($m); $i < $j; ++$i) {
$hex2[] = str_pad(base_convert($m[$i], 16, 2), 4, '0', STR_PAD_LEFT);
}
$hex2 = implode('', $hex2);
$hex2 = $this->str_rsplit($hex2, 6);
foreach($hex2 as $one) {
$hex64[] = $KeyCode[bindec($one)];
}
$return = preg_replace('/^0*/', '', implode('', $hex64));
if($len) {
$clen = strlen($return);
if($clen >= $len) {
return $return;
}
else {
return str_pad($return, $len, '0', STR_PAD_LEFT);
}
}
return $return;
}
/**
* 功能和PHP原生函数str_split接近,只是从尾部开始计数切割
* @param $str string 需要切割的字符串
* @param $len integer 每段字符串的长度
* @return array
* @author 野马
*/
protected function str_rsplit($str, $len = 1) {
if($str == null || $str == false || $str == '') return false;
$strlen = strlen($str);
if($strlen <= $len) return array($str);
$headlen = $strlen % $len;
if($headlen == 0) {
return str_split($str, $len);
}
$return = array(substr($str, 0, $headlen));
return array_merge($return, str_split(substr($str, $headlen), $len));
}
}
?>
工作中发现我们平时吧加密密码、授权证书、文件指纹等等进行存储和使用的时候大部分是直接使用的md5值,md5值是一个32位长16进制整数,其实我们可以吧这个16进制数转换成64进制,实现同样的功能,缩短字符串长度(32位的16进制MD5值可以压缩为22位的64进制数)。至于缩短长度有啥用处,我想你懂得O(∩_∩)O~
02 echo "\r\n<br />1:" . hex16to64('1');
03 echo "\r\n<br />2:" . hex16to64('2');
04 echo "\r\n<br />3:" . hex16to64('3');
05 echo "\r\n<br />4:" . hex16to64('4');
06 echo "\r\n<br />5:" . hex16to64('5');
07 echo "\r\n<br />6:" . hex16to64('6');
08 echo "\r\n<br />7:" . hex16to64('7', 5);
09 echo "\r\n<br />8:" . hex16to64('8');
10 echo "\r\n<br />9:" . hex16to64('9');
11 echo "\r\n<br />a:" . hex16to64('a');
12 echo "\r\n<br />b:" . hex16to64('b');
13 echo "\r\n<br />c:" . hex16to64('c');
14 echo "\r\n<br />d:" . hex16to64('d');
15 echo "\r\n<br />e:" . hex16to64('e');
16 echo "\r\n<br />f:" . hex16to64('f');
17 echo "\r\n<br />10:" . hex16to64('10',4);
18 echo "\r\n<br />fffffffffffffffffffffffffffffffe:" . hex16to64('fffffffffffffffffffffffffffffffe',22);
19 echo "\r\n<br />ffffffffffffffffffffffffffffffff:" . hex16to64('ffffffffffffffffffffffffffffffff',22);
20 echo "\r\n<br />126ede66b4c850a68d56526ae05fbd11:" . hex16to64('126ede66b4c850a68d56526ae05fbd11',22);
21 echo "\r\n<br />7590ee342aa65cbb0dc40418f5474aca:" . hex16to64('7590ee342aa65cbb0dc40418f5474aca',22);
22 echo "\r\n<br />";
23
24 $strarr = array();
25 $time1 = microtime(true);
26 for($i = 0; $i < 10000; ++$i) {
27 $str = md5($i);
28 $strarr[] = "{$i}->$str\r\n<br>";
29 }
30 $time2 = microtime(true);
31 $time3 = $time2 - $time1;
32
33 $time1 = microtime(true);
34 for($i = 0; $i < 10000; ++$i) {
35 $str = hex16to64(md5($i), 22);
36 $strarr[] = "{$i}->$str\r\n<br>";
37 }
38 $time2 = microtime(true);
39 echo "\r\n<br />运行10000次用时(秒):" . ($time2 - $time1 - $time3);
40
41 /**
42 * 将16进制的数字字符串转为64位的数字字符串
43 * @param $m string 16进制的数字字符串
44 * @param $len integer 返回字符串长度,如果长度不够用0填充,0为不填充
45 * @return string
46 * @author 野马
47 */
48 function hex16to64($m, $len = 0) {
49 $code = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_%';
50 $hex2 = array();
51 for($i = 0, $j = strlen($m); $i < $j; ++$i) {
52 $hex2[] = str_pad(base_convert($m[$i], 16, 2), 4, '0', STR_PAD_LEFT);
53 }
54 $hex2 = implode('', $hex2);
55 $hex2 = str_rsplit($hex2, 6);
56 foreach($hex2 as $one) {
57 $hex64[] = $code[bindec($one)];
58 }
59 $return = preg_replace('/^0*/', '', implode('', $hex64));
60 if($len) {
61 $clen = strlen($return);
62 if($clen >= $len) {
63 return $return;
64 }
65 else {
66 return str_pad($return, $len, '0', STR_PAD_LEFT);
67 }
68 }
69 return $return;
70 }
71 /**
72 * 功能和PHP原生函数str_split接近,只是从尾部开始计数切割
73 * @param $str string 需要切割的字符串
74 * @param $len integer 每段字符串的长度
75 * @return array
76 * @author 野马
77 */
78 function str_rsplit($str, $len = 1) {
79 if($str == null || $str == false || $str == '') return false;
80 $strlen = strlen($str);
81 if($strlen <= $len) return array($str);
82 $headlen = $strlen % $len;
83 if($headlen == 0) {
84 return str_split($str, $len);
85 }
86 $return = array(substr($str, 0, $headlen));
87 return array_merge($return, str_split(substr($str, $headlen), $len));
88 }
89 ?>
以上代码在SAE上的执行效率还算不错:
http://enshui.sinaapp.com/jinzhi64.php
![](http://yuenshui.com/uploads/2011/01/bug009.png)
10进制和64进制互转相关推荐
- java 10进制转64进制_十进制与64进制互相转换算法
实现代码如下: /** * */ package com.M.controller.test; import java.util.Stack; /** * * @author online zuozu ...
- javascript 10进制和64进制的转换
原文:javascript 10进制和64进制的转换 function string10to64(number) {var chars = '0123456789abcdefghigklmnopqrs ...
- java 10进制转64进制_JAVA中实现十进制与其它自定义进制进行相互转换。 - yz124的日志 - 网易博客...
我们通常用到的数字都是十进制的,日常使用的也是这样,但是在程序中,我们可能还会经常用到二进制.八进制.十六进制的数字.既然程序中会使用到,那么就会有它存在的道理.有些时候,将数字用字符串保存到文件或者 ...
- java 16进制转64进制_Java进制概述及进制间的相互转换
什么是进制? 进制也是进位制,是人们规定的一种进位方法.对于任何一种进制--X进制,就表示某一位置上的数运算时是逢X进一位.十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推. 十进 ...
- C#实现10进制转32进制和64进制,排除0、l(L)和o
2019独角兽企业重金招聘Python工程师标准>>> class Code32Demo{static void Main(string[] args){Console.WriteL ...
- js 64进制转换方法 URL参数压缩
经常URL上面需要有不少中文,但直接放置中文容易出现乱码,所以要进行转码,但普通转码后,会发现URL太长了,不便于保存和处理.和朋友讨论以后,觉得可以使用一定的压缩算法,将转码后的中文进行处理,能够明 ...
- java 64进制转10进制_java进制转换
import java.math.BigDecimal; import java.util.LinkedList; import java.util.List; import java.util.st ...
- 16进制与10进制互转,16进制转10进制,10进制转16进制
近期在调试单片机时需要观看端口数据,需要将16进制数据转化成10进制数据.在网上找了蛮多都只能实现单个数据的转化,于是便用PYTHON编写了一份. import tkinter as tk root= ...
- php 64进制转16进制,PHP进制转换[实现2、8、16、36、64进制至10进制相互转换]
$mtime1= explode(" ", microtime()); $startTime= $mtime1[0] + $mtime1[1];?> 进制转换 2 8 10 ...
最新文章
- Docker容器的生命周期管理
- mysql多表查询详解_MySQL多表查询详解上
- memcpy、memmove、memset、memchr、memcmp、strstr详解
- Daily scrum 10.15
- AI是计算机科学,人工智能计算机科学(79种)...
- 面试官:怎么改进哈希算法实现负载均衡的扩展性和容错性?我:...
- jclasslib查看字节码
- 荣耀V40将采用300Hz 触控采样率,1月18日正式发布!
- modelandview为null的原因_一千个不用 Null 的理由!
- 一文带你了解目前的“光伏母亲公路” 能照明充电和融雪
- Sql Server 全文检索
- 学习笔记02-虚拟机安装Windows server 2008 r2
- P1336 课题选择
- wps两个段落之间间隔太大,将段落中的行距设为0也没用
- android随手记毕业论文,关于毕业论文的思考
- 比较工具导出html比较结果,使用Beyond Compare如何生成文件比较报告
- win10打开蓝牙_Win10系统中蓝牙鼠标可以配对却无法使用应该如何解决?
- 线程状态是五种对?还是六种对?
- 存储模型之虚拟存储技术
- 分享30个PHP源码,总有一款适合你