note 104709 deleted from function.base-convert by danbrown
| From: | danbrown@php.net | Date: | Sat, 02 Jul 2011 01:45:17 +0000 |
| Subject: | note 104709 deleted from function.base-convert by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-181153@lists.php.net to get a copy of this message | ||
Note Submitter: fordiman at gmail dot com
----
<?php
// Similar to Ruiz's RFC Base 32 class, but for Douglas Crockford's ambiguity-collapsing
version of the spec.
abstract class Crock32 {
static private $encodeMap = array(0,1,2,3,4,5,6,7,
8,9,'a','b','c','d','e','f',
'g','h','j','k','m','n','p','q',
'r','s','t','v','w','x','y','z'
);
static private $decodeMap =
array('l'=>1,'i'=>1,'o'=>0,'u'=>27);
static private function decodeMap($ch) {
if (empty(self::$decodeMap['a']))
forEach(self::$encodeMap as $i=>$v) self::$decodeMap[$v]=$i;
return self::$decodeMap[strToLower($ch)];
}
static private function bitsFromString($str) {
$bStr = array();
for ($i=0; $i<strlen($str); $i++)
$bStr[]= str_pad(base_convert(ord($str[$i]), 10, 2), 8, '0', STR_PAD_LEFT);
return join('', $bStr);
}
static private function b32FromBits($bits) {
$bStr = str_split($bits, 5);
$enc='';
for($i=0; $i<count($bStr); $i++)
$enc.=self::$encodeMap[base_convert(str_pad($bStr[$i],5,'0'),2,10)];
return $enc;
}
static private function bitsFromb32($str) {
$bStr=array();
for ($i=0; $i<strlen($str); $i++)
$bStr[]=str_pad(base_convert(self::decodeMap($str[$i]),10,2),5,'0',STR_PAD_LEFT);
return join('', $bStr);
}
static private function stringFromBits($bits) {
$bStr = str_split(substr($bits,0,floor(strlen($bits)/8)*8), 8);
$ret = '';
for ($i=0; $i<count($bStr); $i++) {
$b = $bStr[$i];
$o = base_convert($b, 2, 10);
$c = chr($o);
$ret.=$c;
}
return $ret;
}
static function encode($str) {
return self::b32FromBits(self::bitsFromString($str));
}
static function decode($enc) {
return self::stringFromBits(self::bitsFromb32($enc));
}
}