php实现的任意进制互转类分享

之前不知道php自带有base_convert可以实现任意进制之间的转换,自己写了一个。。。。

<?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;
 }

}
?>
(0)

相关推荐

  • PHP自定义多进制的方法

    如下所示: /** * 自定义多进制,根据设置的多进制字符串获取十进制对应的多进制 * @param $str 自定义的多进制字符串 * @param $num 十进制数字 * @return $xbin 对应的多进制数字 */ function xbin($str, $num){ $num = floatval($num); $x = strlen($str); $arr = str_split($str); $digit = fmod($num, $x); $xbin = isset($ar

  • php实现将任意进制数转换成10进制的方法

    本文实例讲述了php实现将任意进制数转换成10进制的方法.分享给大家供大家参考.具体如下: php将任意进制的数转换成10进制,例如8进制转换成10进制,16进制转换成10进制 <?php # Show the steps involved in converting a number # from any base (like octal or hex) to base 10 # See below for examples, instructions and copyright functi

  • php实现的任意进制互转类分享

    之前不知道php自带有base_convert可以实现任意进制之间的转换,自己写了一个.... <?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'

  • Golang如何实现任意进制转换的方法示例

    前言 最近因为工作的需要,需要写个短链服务,用到了10->62进制,网上找了一个,可以转换最多76位进制的博客,现在分享出来,下面话不多说了,来一起看看详细的介绍吧. 压缩数据用,无损压缩 示例代码: package main import ( "fmt" "math" "strconv" "strings" ) var tenToAny map[int]string = map[int]string{0: "

  • 2~62位任意进制转换方法(c++)

    进制转换的符号表为[0-9a-zA-Z],共61个字符,最大可表示62进制. 思路是原进制先转换为10进制,再转换到目标进制. 疑问: 对于负数,有小伙伴说可以直接将符号丢弃,按照整数进行进位转换,最后再将负号补回来,我认为这种做法是不对的. 正确的做法是:考虑好按照16位(short)还是32位(int)抑或64位(long long),先求出二进制补码(这时候就正负数就统一了),将二进制数转换为十进制后在转换为其他进制(如果有小伙伴知道如何直接将二进制转换为任意进制的方法可以留言告诉我,不胜

  • C++ 基础编程之十进制转换为任意进制及操作符重载

    C++ 基础编程之十进制转换为任意进制及操作符重载 最近学习C++ 的基础知识,完成十进制转换为任意进制及操作符重载,在网上找的不错的资料,这里记录下, 实例代码: #include<iostream> #include<vector> #include<limits> using namespace std; using std::iterator; ///<summary> ///十进制转换为任意进制,为了熟悉操作符,也加了操作符重载. ///包括自增(

  • Java实现任意进制转换

    本文实例为大家分享了Java实现任意进制转换的具体代码,供大家参考,具体内容如下 问题描述 编写程序实现任意进制间的相互转换 (一).进制转换思想 1.先把任意进制转化为十进制 2.再把十进制转化为任意进制 3.本算法结合了十以下进制利用公式转换以及十以上进制调用函数转换 (二).问题分析 1.输入当前数进制 输入当前进制 m ,且保证 m>1 public static void main (String[] args){ int l,m,n; String l16; Scanner sc =

  • C语言实现任意进制转换器

    本文实例为大家分享了C语言实现任意进制转换器的具体代码,供大家参考,具体内容如下 简单的C语言任意进制转换器 该进制转换器可进行任意进制转换,请看效果图: 代码 /** ******函数声明 ******进制函数,输入与输出 void main(); ******返回将n进制num转换成的十进制数 int NToD(char *num,int n); ******将十进制数d转换成m进制数mnum void DToM(int d,int m,char *mnum); */ #include<st

  • Java实现的进制转换工具类完整示例

    本文实例讲述了Java实现的进制转换工具类.分享给大家供大家参考,具体如下: import java.nio.charset.Charset; /** * 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制,一般用数字0到9和字母A到F表示(其中:A~F即10~15).<br> * 例如十进制数57,在二进制写作111001,在16进制写作39.<br> * 像java,c这样的语言为了区分十六进制和十进制数值,会在十六进制数的前面加上 0x,比如0x20是十进制的

  • 基于Java实现进制转换工具类的示例代码

    目录 背景 原理 十进制A转换为N进制R N进制R转换为十进制A 应用 延伸 背景 最近有个发送短信的功能,需要在短信中带有详情链接,链接中带有对应信息且要有校验功能,然而短信是按字数收费的,所以链接要尽可能的短.链接中带有数字类型参数,就想到通过低进制转高进制可以减少参数长度. 原理 低进制转换到高进制的时候可能会减少位数,例如二进制是满二进一,十进制是满十进一. 二进制:101001101 转换为对应的四进制为:11031 转换为对应的八进制为:515 转换为对应的十进制为:333 转换为对

  • 使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)

    不过,status中包含了一个mid字段,通过mid,我们实际上是可以通过计算得到url的. 在开始计算之前有必要说明一下,什么是base62编码.它实际上就是十进制和62位进制的互换.对于62进制,从0数到9以后,10用小写字母a表示,接着数完26个字母,到z为35,然后36为大写字母A,一直到61为大写字母Z.所以,我们可以实现十进制数字base62编码的encode和decode.下面的代码实际上来自stackoverflow: 复制代码 代码如下: ALPHABET = "0123456

随机推荐