之前不知道php自带有base_convert可以实现任意进制之间的转换,自己写了一个。。。。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
<?php
/**
* 进制转换类
* @author sgf@funcity
* @version 2011-02-15
*/
Class Hex{
private static $element = array (
'0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' ,
'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' ,
'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' ,
'U' , 'V' , 'W' , 'X' , 'Y' , 'Z'
);
private static $hex_min = 2;
private static $hex_max = 36;
/**
* 进制转换
*/
public function conv( $int , $out_hex , $in_hex =10, $use_system =true){
if ( $use_system && function_exists( 'base_convert' )){
return strtoupper ( base_convert ( $int , $in_hex , $out_hex ));
}
if ( $out_hex == $in_hex ){
return $int ;
}
if ( $out_hex > self:: $hex_max || $out_hex < self:: $hex_min ){
return false;
}
if ( $in_hex > self:: $hex_max || $in_hex < self:: $hex_min ){
return false;
}
$hex_10 = $this ->_conv2hex10( $int , $in_hex );
return strtoupper ( $this ->_conv_hex( $hex_10 , $out_hex ));
}
/**
* 将任意进制数字转为10进制数字
*/
private function _conv2hex10( $int , $in_hex ){
$int = strtoupper (trim( $int ));
if ( $in_hex ==10){
return $int ;
} elseif ( $in_hex == 2 && function_exists( 'bindec' )){
return bindec ( $int );
} elseif ( $in_hex == 16 && function_exists( 'hexdec' )){
return hexdec( $int );
} elseif ( $in_hex == 8 && function_exists( 'octdec' )){
return octdec( $int );
}
$array = array ();
$result = 0;
for ( $i =0; $i < strlen ( $int ); $i ++){
array_unshift ( $array , substr ( $int , $i ,1)); //插入到数组头部(既倒序)
}
foreach ( $array as $k => $v ){
$hex10_value = array_search ( $v ,self:: $element );
if ( $hex10_value ==-1){
return false;
}
$result += intval ( pow( $in_hex , $k ) * $hex10_value );
}
return $result ;
}
/**
* 把10进制数换成任意进制数
*/
private function _conv_hex( $hex_10 , $out_hex ){
$hex_10 = intval ( $hex_10 );
if ( $out_hex ==10){
return $hex_10 ;
} else if ( $out_hex ==2 && function_exists( 'decbin' )){
return decbin ( $hex_10 );
} elseif ( $out_hex ==16 && function_exists( 'dechex' )){
return dechex ( $hex_10 );
} elseif ( $out_hex ==8 && function_exists( 'decoct' )){
return decoct ( $hex_10 );
}
$array = array ();
$result = "" ;
//利用10进制数除任意进制数 倒取余数法转换。
do {
array_unshift ( $array , $hex_10 % $out_hex ); //余数插入到数组数组第1个位置。
$hex_10 = $hex_10 / $out_hex ; //除法
} while ( $hex_10 >1);
foreach ( $array as $k ){
$result .= self:: $element [ $k ];
}
return $result ;
}
}
?>
|