base_convert

(PHP 4, PHP 5, PHP 7, PHP 8)

base_convert在任意进制之间转换数字

描述

base_convert(string $num, int $from_base, int $to_base): string

返回一个字符串,其中包含以 to_base 进制表示的 numnum 所使用的进制在 from_base 中指定。 from_baseto_base 必须在 2 到 36(含)之间。大于 10 进制的数字中的数字将使用字母 a-z 表示,其中 a 表示 10,b 表示 11,z 表示 35。字母的大小写无关紧要,即 num 的解释不区分大小写。

警告

base_convert() 可能会在处理大数字时损失精度,这是由于内部使用的 float 类型的特性造成的。请参阅手册中的 浮点数 部分,以获取更详细的信息和限制。

参数

num

要转换的数字。 num 中的任何无效字符都会被静默忽略。 从 PHP 7.4.0 开始,提供任何无效字符都会被弃用。

from_base

num 所使用的进制

to_base

要将 num 转换到的进制

返回值

num 转换为 to_base 进制

变更日志

版本 描述
7.4.0 传递无效字符现在会生成弃用通知。 结果仍然会像无效字符不存在一样进行计算。

示例

示例 #1 base_convert() 示例

<?php
$hexadecimal
= 'a37334';
echo
base_convert($hexadecimal, 16, 2);
?>

上面的示例将输出

101000110111001100110100

参见

添加注释

用户贡献的注释 26 个注释

PHPCoder at niconet2k dot com
12 年前
将任意大的数字从任何进制转换为任何进制。

string convBase(string $numberInput, string $fromBaseInput, string $toBaseInput)
$numberInput 要转换的数字,以字符串形式
$fromBaseInput 要转换数字的进制,以字符串形式
$toBaseInput 要将数字转换到的进制,以字符串形式
$fromBaseInput 和 $toBaseInput 的示例
'0123456789ABCDEF' 用于十六进制(16 进制)
'0123456789' 用于十进制(10 进制)
'01234567' 用于八进制(8 进制)
'01' 用于二进制(2 进制)
您可以随意输入,第一个字符是 0。
示例

<?php
convBase
('123', '0123456789', '01234567');
//将 '123' 从十进制(10 进制)转换为八进制(8 进制)。
//结果:173

convBase('70B1D707EAC2EDF4C6389F440C7294B51FFF57BB', '0123456789ABCDEF', '01');
//将 '70B1D707EAC2EDF4C6389F440C7294B51FFF57BB' 从十六进制(16 进制)转换为二进制(2 进制)。
//结果:
//111000010110001110101110000011111101010110000101110
//110111110100110001100011100010011111010001000000110
//001110010100101001011010100011111111111110101011110
//111011

convBase('1324523453243154324542341524315432113200203012', '012345', '0123456789ABCDEF');
//将 '1324523453243154324542341524315432113200203012' 从六进制(6 进制)转换为十六进制(16 进制)。
//结果:1F9881BAD10454A8C23A838EF00F50

convBase('355927353784509896715106760','0123456789','Christopher');
//将 '355927353784509896715106760' 从十进制(10 进制)转换为十一进制(11 进制),使用 "Christopher" 作为数字。
//结果:iihtspiphoeCrCeshhorsrrtrh

convBase('1C238Ab97132aAC84B72','0123456789aAbBcCdD', '~!@#$%^&*()');
//将'1C238Ab97132aAC84B72' 从十八进制(18 进制)转换为十一进制(11 进制),使用 '0123456789aAbBcCdD' 作为数字,使用 '~!@#$%^&*()' 作为数字。
//结果:!%~!!*&!~^!!&(&!~^@#@@@&

function convBase($numberInput, $fromBaseInput, $toBaseInput)
{
if (
$fromBaseInput==$toBaseInput) return $numberInput;
$fromBase = str_split($fromBaseInput,1);
$toBase = str_split($toBaseInput,1);
$number = str_split($numberInput,1);
$fromLen=strlen($fromBaseInput);
$toLen=strlen($toBaseInput);
$numberLen=strlen($numberInput);
$retval='';
if (
$toBaseInput == '0123456789')
{
$retval=0;
for (
$i = 1;$i <= $numberLen; $i++)
$retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i)));
return
$retval;
}
if (
$fromBaseInput != '0123456789')
$base10=convBase($numberInput, $fromBaseInput, '0123456789');
else
$base10 = $numberInput;
if (
$base10<strlen($toBaseInput))
return
$toBase[$base10];
while(
$base10 != '0')
{
$retval = $toBase[bcmod($base10,$toLen)].$retval;
$base10 = bcdiv($base10,$toLen,0);
}
return
$retval;
}
?>
ardavies at tiscali dot co dot uk
10 年前
为了将只包含字母数字字符(A-Z)的 26 进制(六十六进制)转换为十进制,不包含整数(如 http://en.wikipedia.org/wiki/Hexavigesimal 中所述),我发现这很有用。

function base_convert_alpha( $str, $from, $to )
{
$r = range( 'A', 'Z' );
$clean = str_replace( $r, array_keys($r), $str );
return base_convert( $clean, $from, $to );
}

echo base_convert_alpha( "BAC", 26, 10 );

//$clean = 102,然后返回 678
匿名
5 年前
虽然从上面的描述中并不明显,但负号也会被“静默忽略”。

base_convert("-12", 10, 10) => 12
JR
12 年前
简短的阿拉伯数字到罗马数字转换器

<?php
function rome($N){
$c='IVXLCDM';
for(
$a=5,$b=$s='';$N;$b++,$a^=7)
for(
$o=$N%$a,$N=$N/$a^0;$o--;$s=$c[$o>2?$b+$N-($N&=-2)+$o=1:$b].$s);
return
$s;
}
?>

它可以正常工作!
Clifford dot ct at gmail dot com
12 年前
如果您使用 base_convert 将一个大型(例如 80 位)十六进制数转换为 36 进制,您可能会观察到

ABCDEF00001234567890(十六进制)=> 3O47RE02JZSW0KS8(36 进制)=> ABCDEF00001240000000(十六进制)

这是正常的,因为在处理大数时精度会有所损失。

我写了一个基于字符串的函数,使用了内置的 BC Math 扩展,可以解决这个问题和类似问题。

<?php

function str_baseconvert($str, $frombase=10, $tobase=36) {
$str = trim($str);
if (
intval($frombase) != 10) {
$len = strlen($str);
$q = 0;
for (
$i=0; $i<$len; $i++) {
$r = base_convert($str[$i], $frombase, 10);
$q = bcadd(bcmul($q, $frombase), $r);
}
}
else
$q = $str;

if (
intval($tobase) != 10) {
$s = '';
while (
bccomp($q, '0', 0) > 0) {
$r = intval(bcmod($q, $tobase));
$s = base_convert($r, 10, $tobase) . $s;
$q = bcdiv($q, $tobase, 0);
}
}
else
$s = $q;

return
$s;
}

?>

典型用例
1. 将一个大型任意精度数字转换为 36 进制。
2. 将一个 32 个字符的十六进制 UUID(128 位)转换为一个 25 个字符的 36 进制唯一键,反之亦然。

示例

<?php
$b16
= 'ABCDEF00001234567890';
$b36 = str_baseconvert($b16, 16, 36);
echo (
"$b16 (十六进制) = $b36 (36 进制) \\n");

$uuid = 'ABCDEF01234567890123456789ABCDEF';
$ukey = str_baseconvert($uuid, 16, 36);
echo (
"$uuid (十六进制) = $ukey (36 进制) \\n");
?>

ABCDEF00001234567890 (十六进制) = 3o47re02jzqisvio (36 进制)
ABCDEF01234567890123456789ABCDEF (十六进制) = a65xa07491kf5zyfpvbo76g33 (36 进制)
lindsay at bitleap dot com
19 年前
如果您需要使用 base_convert 处理超过 32 位的数字,以下 gmp 实现的 base_convert 应该可以工作。

<?php

/*使用 gmp 库进行进制转换,gmp 可以处理超过 32 位的数字*/
function gmp_convert($num, $base_a, $base_b)
{
return
gmp_strval ( gmp_init($num, $base_a), $base_b );
}

?>
xdv43 at yandex dot ru
1 年前
将大型整数转换为十六进制,不使用 PHP Math 扩展。

<?php
/*
* 创建者:Michael Renner,2006 年 5 月 17 日 03:24
*/
function baseConvert($numstring, $frombase, $tobase)
{

$chars = "0123456789abcdefghijklmnopqrstuvwxyz";
$tostring = substr($chars, 0, $tobase);

$length = strlen($numstring);
$result = '';
for (
$i = 0; $i < $length; $i++)
{
$number[$i] = strpos($chars, $numstring[$i]);
}
do
{
$divide = 0;
$newlen = 0;
for (
$i = 0; $i < $length; $i++)
{
$divide = $divide * $frombase + $number[$i];
if (
$divide >= $tobase)
{
$number[$newlen++] = (int)($divide / $tobase);
$divide = $divide % $tobase;
} elseif (
$newlen > 0)
{
$number[$newlen++] = 0;
}
}
$length = $newlen;
$result = $tostring[$divide] . $result;
} while (
$newlen != 0);
return
$result;
}
Theriault
14 年前
如果您想将数字转换为仅包含大写字母的进制,反之亦然(例如 Microsoft Windows Excel 工作表中的列名……A-Z, AA-ZZ, AAA-ZZZ, ...),以下函数可以实现这一功能。

<?php

/**
* 将整数转换为字母基数 (A-Z)。
*
* @param int $n 要转换的数字。
* @return string 转换后的数字。
* @author Theriault
*
*/
function num2alpha($n) {
$r = '';
for (
$i = 1; $n >= 0 && $i < 10; $i++) {
$r = chr(0x41 + ($n % pow(26, $i) / pow(26, $i - 1))) . $r;
$n -= pow(26, $i);
}
return
$r;
}
/**
* 将字母字符串转换为整数。
*
* @param int $n 要转换的数字。
* @return string 转换后的数字。
* @author Theriault
*
*/
function alpha2num($a) {
$r = 0;
$l = strlen($a);
for (
$i = 0; $i < $l; $i++) {
$r += pow(26, $i) * (ord($a[$l - $i - 1]) - 0x40);
}
return
$r - 1;
}

?>

Microsoft Windows Excel 停止在 IV (255) 处,但此函数可以处理更大的数字。但是,英语单词一段时间后会开始形成,有些可能会冒犯,所以要小心。
AdamJacobMuller at AdamJacobMuller dot com
20 年前
<?php
function binarycodedstring2dec($binary) {
$len=strlen($binary);
$rows=($len/4)-1;
if ((
$len%4)>0) {
$pad=$len+(4-($len%4));
$binary=str_pad($binary,$pad,"0",STR_PAD_LEFT);
$len=strlen($binary);
$rows=($len/4)-1;
}
$x=0;
for (
$x=0;$x<=$rows;$x++) {
$s=($x*4);
$bins=$binary[$s].$binary[$s+1].$binary[$s+2].$binary[$s+3];
$num=base_convert($bins,2,10);
if (
$num>9) {
die(
"the string is not a proper binary coded decimal\n");
} else {
$res.=$num;
}
}
return
$res;
}
?>

二进制编码的十进制数是通过从十进制字符串中取四组来转换的。
例如,二进制编码的十进制字符串
1000 = 8
10001000 不等于 136,而是 88
所以
binarycodedstring2dec(1000) = 8
binarycodedstring2dec(11100000111001)=3839
binarycodedstring2dec(100000111001)=839

我真的不知道这个函数对任何人是否有用,我只是因为不知道如何转换二进制编码的十进制数而考试不及格,所以我写了这个函数,以确保我永远不会忘记如何转换二进制编码的十进制数。
tika dot pahadi at selu dot edu
8 年前
请注意,该方法只能转换最大 1024 位长的数字。大多数人不需要这样,但有一次我遇到了一个问题,即二进制字符串被转换为字母数字。在这种情况下,您需要将它们拆分、转换并连接起来。
cyrilbele at yahoo dot fr
15 年前
如果您想进行分片,在某个时候您将需要决定要定位哪个分片。这是一个简单的函数,可以根据键(通常是行的标识符)将数据分配到特定分片。

这是一个简单的函数,可以根据键和可用分片数获取分片。

<?php
function getShard($key,$nbShards) {
$num = substr(base_convert(sha1($key), 16, 10),4,6);
return
$num%$nbShards;
}
?>
simon at simonster dot com
20 年前
以下是一些用于将整数转换为 256 进制和从 256 进制转换的函数。有了这些,转换为 64 进制就很简单了。

<?php
function to_base256($number, $from_base = 10) {
$binary_number = base_convert($number, $from_base, 2);
$final_string = "";
$new_length = (ceil(strlen($binary_number)/8)*8);
$binary_number = str_pad($binary_number, $new_length, "0", STR_PAD_LEFT);
for(
$i=($new_length-8); $i>=0; $i-=8) {
$final_string = chr(base_convert(substr($binary_number, $i, 8), 2, 10)).$final_string;
}
return
$final_string;
}

function
from_base256($string, $to_base = 10) {
$number = "";
for(
$i=0; $i<strlen($string); $i++) {
$number .= str_pad(base_convert(ord($string{$i}), 10, 2), 8, "0", STR_PAD_LEFT);
}
return
base_convert($number, 2, $to_base);
}
?>

我知道如果它使用模运算而不是 base_convert,这会更有效,但它需要与大于 32 位的整数一起使用。
fiftytoo at buckeyeexpress dot com
20 年前
我需要一个函数来反转十六进制值,我用它来设置字体颜色,当它们在彩色背景上时,这样我就可以得到对比色。

我相信还有其他原因可以使用它,您自己决定吧!

<?php
function InvertColor($hex) {
return
sprintf("%06s",base_convert(($hex ^ 0xFFFFFF),10,16));
};

print
'<td bgcolor="BB2222"><font color="'.InvertColor(0xBB2222).'">Blah</font></td>';
// 打印 44dddd 作为字体颜色,它在色轮上是它的反色

?>
denik dot od at gmail dot com
11 年前
将任何长度的位转换为 HEX

function bits2hex($bin)
{
$out = "";
for($i=0;$i<strlen($bin);$i+=8)
{
$byte = substr($bin,$i,8); if( strlen($byte)<8 ) $byte .= str_repeat('0',8-strlen($byte));
$out .= base_convert($byte,2,16);
}
return $out;
}

警告!如果最后一个字节不完整,它将用零作为字符串补充!
wadelau at gmail dot com
6 年前
Base62x 为传统的 Base62 和/或 Base64 提供了一种替代方法。

base62x_encode / base62x_decode 将在将来作为 PHP 中的额外模块合并。

在此之前,用户可以通过以下方式下载 PHP 额外模块:https://github.com/wadelau/Base62x
CJ Dennis
18 年前
非常大的数字可能在两端被截断。
例如
<?php
$binary
="11010101001111010001110101000100011110010110110".
"001111000010001010001111001100011010110110010010011010".
"001011010000001001011111110001010101101101011010101010".
"000100011101110010110010100111110001010010111010110011".
"001111111100011001011011001110001111110000101011010010";
print(
strtoupper(base_convert($binary, 2, 16)));
?>
将输出
9E8EA23CB63C0000000000000000000000000000000000000000000000000000 (64 个十六进制数字)
而正确的结果应该是
6A9E8EA23CB63C228F31AD9268B4097F156D6AA11DCB29F14BACCFF196CE3F0AD2 (66 个十六进制数字)
请注意,除了结果显示你在 B63C 之后预期的 '0' 之外,它还缺少 9E 之前的第一个 6A。
bryan at bryanruiz dot com
13 年前
一个符合 RFC 4648 的 Base32 编码。如果你最终使用位运算和其他方法使它更高效,请给我发邮件。

<?php

/**
* Encode in Base32 based on RFC 4648.
* Requires 20% more space than base64
* Great for case-insensitive filesystems like Windows and URL's (except for = char which can be excluded using the pad option for urls)
*
* @package default
* @author Bryan Ruiz
**/
class Base32 {

private static
$map = array(
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', // 7
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', // 15
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', // 23
'Y', 'Z', '2', '3', '4', '5', '6', '7', // 31
'=' // padding char
);

private static
$flippedMap = array(
'A'=>'0', 'B'=>'1', 'C'=>'2', 'D'=>'3', 'E'=>'4', 'F'=>'5', 'G'=>'6', 'H'=>'7',
'I'=>'8', 'J'=>'9', 'K'=>'10', 'L'=>'11', 'M'=>'12', 'N'=>'13', 'O'=>'14', 'P'=>'15',
'Q'=>'16', 'R'=>'17', 'S'=>'18', 'T'=>'19', 'U'=>'20', 'V'=>'21', 'W'=>'22', 'X'=>'23',
'Y'=>'24', 'Z'=>'25', '2'=>'26', '3'=>'27', '4'=>'28', '5'=>'29', '6'=>'30', '7'=>'31'
);

/**
* Use padding false when encoding for urls
*
* @return base32 encoded string
* @author Bryan Ruiz
**/
public static function encode($input, $padding = true) {
if(empty(
$input)) return "";
$input = str_split($input);
$binaryString = "";
for(
$i = 0; $i < count($input); $i++) {
$binaryString .= str_pad(base_convert(ord($input[$i]), 10, 2), 8, '0', STR_PAD_LEFT);
}
$fiveBitBinaryArray = str_split($binaryString, 5);
$base32 = "";
$i=0;
while(
$i < count($fiveBitBinaryArray)) {
$base32 .= self::$map[base_convert(str_pad($fiveBitBinaryArray[$i], 5,'0'), 2, 10)];
$i++;
}
if(
$padding && ($x = strlen($binaryString) % 40) != 0) {
if(
$x == 8) $base32 .= str_repeat(self::$map[32], 6);
else if(
$x == 16) $base32 .= str_repeat(self::$map[32], 4);
else if(
$x == 24) $base32 .= str_repeat(self::$map[32], 3);
else if(
$x == 32) $base32 .= self::$map[32];
}
return
$base32;
}

public static function
decode($input) {
if(empty(
$input)) return;
$paddingCharCount = substr_count($input, self::$map[32]);
$allowedValues = array(6,4,3,1,0);
if(!
in_array($paddingCharCount, $allowedValues)) return false;
for(
$i=0; $i<4; $i++){
if(
$paddingCharCount == $allowedValues[$i] &&
substr($input, -($allowedValues[$i])) != str_repeat(self::$map[32], $allowedValues[$i])) return false;
}
$input = str_replace('=','', $input);
$input = str_split($input);
$binaryString = "";
for(
$i=0; $i < count($input); $i = $i+8) {
$x = "";
if(!
in_array($input[$i], self::$map)) return false;
for(
$j=0; $j < 8; $j++) {
$x .= str_pad(base_convert(@self::$flippedMap[@$input[$i + $j]], 10, 2), 5, '0', STR_PAD_LEFT);
}
$eightBits = str_split($x, 8);
for(
$z = 0; $z < count($eightBits); $z++) {
$binaryString .= ( ($y = chr(base_convert($eightBits[$z], 2, 10))) || ord($y) == 48 ) ? $y:"";
}
}
return
$binaryString;
}
}
tecdoc at ukr dot net
1 年前
对 "lindsay at bitleap dot com" 建议的方法的补充。

使用 32 位版本的 php 将十六进制字符串轻松转换为十进制字符串
<?php
$test
= '0x7000005a00000ea5';
$rrrrr = gmp_strval($test);
var_dump($test, $rrrrr);
?>
将返回
//string '0x7000005a00000ea5' (length=18)
//string '8070450918794989221' (length=19)

base_convert 将返回 8070450918794990488
Anonymous
6 年前
base32 的另一个小型实现,没有错误捕获。只是将东西从 5 位转换为 8 位,以及从 8 位转换为 5 位。问候。mho

<?
function base32_decode($d)
{
list($t, $b, $r) = array("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", "", "");

foreach(str_split($d) as $c)
$b = $b . sprintf("%05b", strpos($t, $c));

foreach(str_split($b, 8) as $c)
$r = $r . chr(bindec($c));

return($r);
}

function base32_encode($d)
{
list($t, $b, $r) = array("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", "", "");

foreach(str_split($d) as $c)
$b = $b . sprintf("%08b", ord($c));

foreach(str_split($b, 5) as $c)
$r = $r . $t[bindec($c)];

return($r);
}
?>
ohcc at 163 dot com
6 年前
<?php
$v
= base_convert(3.14, 10, 10);
var_dump($v);
?>

输出:string(3) "314"
liams dot test dot acc at gmail dot com
8 年前
我写这个是为了一个大学作业,用来缩短网址。它适用于任何进制,以及任何范围的字符,例如 A-Za-z0-9 等。希望它能帮到某些人。

<?php

$base
= range(0, 1);
$number = 255;

function
translate($base, $number){

$array = array();
$n = count($base);
$i = $number;

while(
true){

/* 通过计算 $i % $n,我们可以得到数字被进制除后的余数。
* 从 $i (数字) 中减去结果,并除以 $n (进制),我们将结果重新赋值给 $i,从而转移到下一个最小的
* 指数,并进行新一轮循环。它会持续执行此操作,不断
* 输出余数,直到 $i <= 0,此时它将退出循环。
*/

if($i <= 0){

break;
}else{
$r = ($i % $n);

// 重新分配 $i 的值
$i = ($i - $r) / $n;

$array[] = $base[$r];
}
}
$string = implode("", $array);
return
$string;
}

$string = translate($base, $number);
echo
$string;

// 打印 11111111
?
bpds
12 年前
一个将整数转换为任何进制的简单函数。

<?php
function intToAlphaBaseN($n,$baseArray) {
$l=count($baseArray);
$s = '';
for (
$i = 1; $n >= 0 && $i < 10; $i++) {
$s = $baseArray[($n % pow($l, $i) / pow($l, $i - 1))].$s;
$n -= pow($l, $i);
}
return
$s;
}

$alpha=array('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');
$r=rand(0, 99999999999);
echo(
intToAlphaBaseN($r,$alpha));
?>
andrew at youritland dot co dot uk
10 年前
使用 base_convert 生成随机密码的示例

function random_password()
{
$rvalue1 = mt_rand(100,999);
$rvalue2 = time();
$rvalue3 = mt_rand(1000,9999);
$rvalue4 = mt_rand(1,9);
$rvalue5 = mt_rand(101,109);
// 合并值
$rvalues = intval(((($rvalue2.$rvalue3) + $rvalue1)*$rvalue4) / $rvalue5);

// 以 35 进制返回结果(将包含从 '0' 到 'z' 的字符)
return base_convert($rvalues,10,35);
}

更改 rvalue5 的范围以获得更多或更少的字符。此设置
将返回 8 个字符。
Ray Paseur 有时使用 GMail
17 年前
[由 danbrown AT php DOT net 编辑:此函数提供阿拉伯数字(世界大多数人使用的数字,标准 1,2,3,4,...)转换为罗马数字(I,II,III,IV,...)的转换。 原作者没有提供说明,但由于该函数的实用性,它被保留以防删除,并添加了一个简单的说明。]

<?php
function roman_numerals($input_arabic_numeral='') {

if (
$input_arabic_numeral == '') { $input_arabic_numeral = date("Y"); } // 默认输出:今年
$arabic_numeral = intval($input_arabic_numeral);
$arabic_numeral_text = "$arabic_numeral";
$arabic_numeral_length = strlen($arabic_numeral_text);

if (!
ereg('[0-9]', $arabic_numeral_text)) {
return
false; }

if (
$arabic_numeral > 4999) {
return
false; }

if (
$arabic_numeral < 1) {
return
false; }

if (
$arabic_numeral_length > 4) {
return
false; }

$roman_numeral_units = $roman_numeral_tens = $roman_numeral_hundreds = $roman_numeral_thousands = array();
$roman_numeral_units[0] = $roman_numeral_tens[0] = $roman_numeral_hundreds[0] = $roman_numeral_thousands[0] = ''; // 罗马数字中没有零

$roman_numeral_units[1]='I';
$roman_numeral_units[2]='II';
$roman_numeral_units[3]='III';
$roman_numeral_units[4]='IV';
$roman_numeral_units[5]='V';
$roman_numeral_units[6]='VI';
$roman_numeral_units[7]='VII';
$roman_numeral_units[8]='VIII';
$roman_numeral_units[9]='IX';

$roman_numeral_tens[1]='X';
$roman_numeral_tens[2]='XX';
$roman_numeral_tens[3]='XXX';
$roman_numeral_tens[4]='XL';
$roman_numeral_tens[5]='L';
$roman_numeral_tens[6]='LX';
$roman_numeral_tens[7]='LXX';
$roman_numeral_tens[8]='LXXX';
$roman_numeral_tens[9]='XC';

$roman_numeral_hundreds[1]='C';
$roman_numeral_hundreds[2]='CC';
$roman_numeral_hundreds[3]='CCC';
$roman_numeral_hundreds[4]='CD';
$roman_numeral_hundreds[5]='D';
$roman_numeral_hundreds[6]='DC';
$roman_numeral_hundreds[7]='DCC';
$roman_numeral_hundreds[8]='DCCC';
$roman_numeral_hundreds[9]='CM';

$roman_numeral_thousands[1]='M';
$roman_numeral_thousands[2]='MM';
$roman_numeral_thousands[3]='MMM';
$roman_numeral_thousands[4]='MMMM';

if (
$arabic_numeral_length == 3) { $arabic_numeral_text = "0" . $arabic_numeral_text; }
if (
$arabic_numeral_length == 2) { $arabic_numeral_text = "00" . $arabic_numeral_text; }
if (
$arabic_numeral_length == 1) { $arabic_numeral_text = "000" . $arabic_numeral_text; }

$anu = substr($arabic_numeral_text, 3, 1);
$anx = substr($arabic_numeral_text, 2, 1);
$anc = substr($arabic_numeral_text, 1, 1);
$anm = substr($arabic_numeral_text, 0, 1);

$roman_numeral_text = $roman_numeral_thousands[$anm] . $roman_numeral_hundreds[$anc] . $roman_numeral_tens[$anx] . $roman_numeral_units[$anu];
return (
$roman_numeral_text);
}
?>
Baji dot Panchumarti at gmail dot com
12 年前
将 base_convert 扩展到 36 以上的进制,直至 62 进制。

<?php
function base_convert_x( $_number='', $_frBase=10, $_toBase=62 ) {

# Today's Date - C74 - convert a string (+ve integer) from any arbitrary base to any arbitrary base, up to base 62, using 0-9,A-Z,a-z
#
# Usage : echo base_convert_x( 123456789012345, 10, 32 );

$_10to62 = array(
'0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '00' => '0', '01' => '1', '02' => '2', '03' => '3', '04' => '4', '05' => '5', '06' => '6', '07' => '7',
'10' => 'A', '11' => 'B', '12' => 'C', '13' => 'D', '14' => 'E', '15' => 'F', '16' => 'G', '17' => 'H', '18' => 'I', '19' => 'J', '20' => 'K', '21' => 'L', '22' => 'M', '23' => 'N', '24' => 'O', '25' => 'P', '26' => 'Q', '27' => 'R',
'30' => 'U', '31' => 'V', '32' => 'W', '33' => 'X', '34' => 'Y', '35' => 'Z', '36' => 'a', '37' => 'b', '38' => 'c', '39' => 'd', '40' => 'e', '41' => 'f', '42' => 'g', '43' => 'h', '44' => 'i', '45' => 'j', '46' => 'k', '47' => 'l',
'50' => 'o', '51' => 'p', '52' => 'q', '53' => 'r', '54' => 's', '55' => 't', '56' => 'u', '57' => 'v', '58' => 'w', '59' => 'x', '60' => 'y', '61' => 'z' );

$_62to10 = array(
'0' => '00', '1' => '01', '2' => '02', '3' => '03', '4' => '04', '5' => '05', '6' => '06', '7' => '07', '8' => '08', '9' => '09', 'A' => '10', 'B' => '11', 'C' => '12', 'D' => '13', 'E' => '14', 'F' => '15', 'G' => '16', 'H' => '17',
'K' => '20', 'L' => '21', 'M' => '22', 'N' => '23', 'O' => '24', 'P' => '25', 'Q' => '26', 'R' => '27', 'S' => '28', 'T' => '29', 'U' => '30', 'V' => '31', 'W' => '32', 'X' => '33', 'Y' => '34', 'Z' => '35', 'a' => '36', 'b' => '37',
'e' => '40', 'f' => '41', 'g' => '42', 'h' => '43', 'i' => '44', 'j' => '45', 'k' => '46', 'l' => '47', 'm' => '48', 'n' => '49', 'o' => '50', 'p' => '51', 'q' => '52', 'r' => '53', 's' => '54', 't' => '55', 'u' => '56', 'v' => '57',
'y' => '60', 'z' => '61' );

# ---- First convert from frBase to base-10

$_in_b10 = 0;
$_pwr_of_frB = 1; # power of from base, eg. 1, 8, 64, 512
$_chars = str_split( $_number ); # split input # into chars
$_str_len = strlen( $_number );
$_pos = 0;

while (
$_pos++ < $_str_len ) {
$_char = $_chars[$_str_len - $_pos];
$_in_b10 += (((int) $_62to10[$_char] ) * $_pwr_of_frB);
$_pwr_of_frB *= $_frBase;
}

# ---- Now convert from base-10 to toBase

$_dividend = (int) $_in_b10; # name dividend easier to follow below
$_in_toB = ''; # number string in toBase

while ( $_dividend > 0 ) {

$_quotient = (int) ( $_dividend / $_toBase ); # eg. 789 / 62 = 12 ( C in base 62 )
$_remainder = '' . ( $_dividend % $_toBase ); # 789 % 62 = 45 ( j in base 62 )
$_in_toB = $_10to62[$_remainder] . $_in_toB; # 789 (in base 10) = Cj (in base 62)
$_dividend = $_quotient; # new dividend is the quotient from base division
}

if (
$_in_toB == '' )
$_in_toB = '0';

return
$_in_toB; # base $_toBase string
}
# --------- examples -------
echo base_convert_x( '3456789ABCDEF', 16, 10 ) . "\n"; # 920735923817967
echo base_convert( '3456789ABCDEF', 16, 10 ) . "\n"; # 920735923817967
?>
francesco[at]paladinux.net
13 年前
base convert 仅限于标准进制。
在某些情况下,如果您想发明一些转换代码(例如授权代码),我希望此 base_convert-AS 从十进制到 65 进制的示例对您有用,以实现 speedCode。
更具体地说:您可以使用数据库进行转换
$speedCodeDEC = $idAziendaMittente.$idAziendaDestinatario.$idDDT ;

//$speedCodeDEC = 3000;

//
$BASECODE = array();
$BASECODE['items'] = 65;
$BASECODE[1]='1';
$BASECODE[2]='2';
$BASECODE[3]='3';
$BASECODE[4]='4';
....
$BASECODE[10]='a';
$BASECODE[11]='b';
$BASECODE[12]='c';
...
$BASECODE[36]='A';
$BASECODE[37]='B';
$BASECODE[38]='C';
...
$BASECODE[61]='Z';
$BASECODE[62]='/';
$BASECODE[63]='-';
$BASECODE[64]='+';
//

//print_r ($BASECODE);TEST

function creaSpeedCode ( $speedCodeDEC,$partialCode="",$BASECODE){

@$division = $speedCodeDEC/$BASECODE['items'];
@$resultINT = floor($speedCodeDEC/$BASECODE['items']);
@$remnant = $speedCodeDEC%$BASECODE['items'];
$partialCode = $BASECODE[$remnant].$partialCode;
echo "
<br>
输入 speedCodeDEC:$speedCodeDEC - partialCode:$partialCode<br>
items : ".$BASECODE['items']."<br>
division : $division <br>
resultINT : $resultINT <br>
remnant : $remnant <br>
partialCode : $partialCode <br>
";//TEST
if ($resultINT > 65) $partialCode = creaSpeedCode($resultINT,$partialCode,$BASECODE);
return $BASECODE[$resultINT].$partialCode;
}
echo $speedCodeDEC."<br>";
echo $risultato = creaSpeedCode ( $speedCodeDEC,"",$BASECODE);
To Top