mauriziofonte /
php-base62x
| 1 | <?php |
||
| 2 | |||
| 3 | namespace Mfonte\Base62x\Encoding; |
||
| 4 | |||
| 5 | // source: https://github.com/wadelau/Base62x/blob/master/Base62x.class.php |
||
| 6 | |||
| 7 | /* |
||
| 8 | * -Base62x in -PHP |
||
| 9 | * [email protected] |
||
| 10 | * Refers to |
||
| 11 | http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=6020065 |
||
| 12 | -GitHub-Wadelau , base62x.c |
||
| 13 | https://github.com/wadelau/Base62x |
||
| 14 | https://ufqi.com/dev/base62x/?_via=-naturedns |
||
| 15 | * Tue Aug 9 21:18:14 CST 2016 |
||
| 16 | * bugfix, 13:39 13 September 2016 |
||
| 17 | * bugfix, Thu Sep 29 04:06:26 UTC 2016 |
||
| 18 | * imprvs on numeric conversion, Fri Oct 7 03:42:59 UTC 2016 |
||
| 19 | * bugifx by _decodeByLength, 20:40 28 November 2016 |
||
| 20 | * imprvs on decode, Mon Mar 11 03:07:37 GMT 2019 |
||
| 21 | */ |
||
| 22 | |||
| 23 | class Base62x |
||
| 24 | { |
||
| 25 | // variables |
||
| 26 | |||
| 27 | public $isdebug = false; |
||
| 28 | public $i = 0; |
||
| 29 | public $codetype = 0; // 0:encode, 1:decode |
||
| 30 | public const XTAG = 'x'; |
||
| 31 | public const ENCD = '-enc'; |
||
| 32 | public const DECD = '-dec'; |
||
| 33 | public const DEBG = '-v'; |
||
| 34 | public const CVTN = '-n'; |
||
| 35 | public const b62x = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', |
||
| 36 | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', |
||
| 37 | 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', |
||
| 38 | 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', |
||
| 39 | 'q', 'r', 's', 't', 'u', 'v', 'w', 'y', 'z', '1', '2', '3', 'x', ]; |
||
| 40 | public const bpos = 60; // 0-60 chars |
||
| 41 | public const xpos = 64; // b62x[64] = 'x' |
||
| 42 | public static $rb62x = []; |
||
| 43 | public const ascmax = 127; |
||
| 44 | public const asclist = ['4', '5', '6', '7', '8', '9', '0', |
||
| 45 | 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', |
||
| 46 | 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', |
||
| 47 | 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', |
||
| 48 | 'q', 'r', 's', 't', 'u', 'v', 'w', 'y', 'z', ]; // 58 |
||
| 49 | public $ascidx = []; |
||
| 50 | public $ascrlist = []; |
||
| 51 | public const max_safe_base = 36; |
||
| 52 | public const base59 = 59; // static $rb62xyz = array(); static $b62xyz = array(); |
||
| 53 | public static $ver = 0.9; |
||
| 54 | |||
| 55 | // methods |
||
| 56 | |||
| 57 | // encode, ibase=2,8,10,16,32... |
||
| 58 | public static function encode($input, $ibase = null) |
||
| 59 | { |
||
| 60 | $output = null; |
||
| 61 | if ($input == null || $input == '') { |
||
| 62 | return $input; |
||
| 63 | } |
||
| 64 | |||
| 65 | $codetype = 0; |
||
| 66 | $xtag = self::XTAG; |
||
| 67 | $b62x = self::b62x; |
||
| 68 | $asclist = self::asclist; |
||
| 69 | $bpos = self::bpos; |
||
| 70 | $xpos = self::xpos; |
||
| 71 | $ascmax = self::ascmax; |
||
| 72 | //$max_safe_base = self::max_safe_base; |
||
| 73 | |||
| 74 | $rb62x = self::fillRb62x($b62x, $bpos, $xpos); |
||
| 75 | $isNum = false; |
||
| 76 | if ($ibase > 0) { |
||
| 77 | $isNum = true; |
||
| 78 | } |
||
| 79 | if ($isNum) { |
||
| 80 | $num_input = self::xx2dec($input, $ibase, $rb62x); |
||
| 81 | $obase = $xpos; |
||
| 82 | $output = self::dec2xx($num_input, $obase, $b62x); |
||
| 83 | // why a mediate number format is needed? |
||
| 84 | } else { |
||
| 85 | // string |
||
| 86 | $ascidx = []; |
||
| 87 | $ascrlist = []; |
||
| 88 | $inputArr = mb_str_split($input); |
||
| 89 | $inputlen = \count($inputArr); |
||
| 90 | //if(!isset($ascidx)){ $ascidx = array(); } |
||
| 91 | //if(!isset($ascrlist)){ $ascrlist = array(); } |
||
| 92 | $setResult = self::setAscii($codetype, $inputArr, $ascidx, $ascmax, $asclist, $ascrlist); |
||
| 93 | $asctype = $setResult['asctype']; |
||
| 94 | $ascidx = $setResult['ascidx']; |
||
| 95 | $ascrlist = $setResult['ascrlist']; |
||
|
0 ignored issues
–
show
Unused Code
introduced
by
Loading history...
|
|||
| 96 | |||
| 97 | $op = []; |
||
| 98 | $i = 0; |
||
| 99 | $m = 0; |
||
| 100 | if ($asctype == 1) { |
||
| 101 | $ixtag = \ord($xtag); |
||
| 102 | do { |
||
| 103 | $inputArr[$i] = \ord($inputArr[$i]); |
||
| 104 | if ($ascidx[$inputArr[$i]] > -1) { |
||
| 105 | $op[$m] = $xtag; |
||
| 106 | $op[++$m] = $ascidx[$inputArr[$i]]; |
||
| 107 | } elseif ($inputArr[$i] == $ixtag) { |
||
| 108 | $op[$m] = $xtag; |
||
| 109 | $op[++$m] = $xtag; |
||
| 110 | } else { |
||
| 111 | $op[$m] = \chr((int) ($inputArr[$i])); |
||
| 112 | } |
||
| 113 | ++$m; |
||
| 114 | } while (++$i < $inputlen); |
||
| 115 | $op[$m] = $xtag; // asctype=1 has a tag 'x' appended |
||
| 116 | } else { |
||
| 117 | $c0 = 0; |
||
| 118 | $c1 = 0; |
||
| 119 | $c2 = 0; |
||
| 120 | $c3 = 0; |
||
|
0 ignored issues
–
show
|
|||
| 121 | do { |
||
| 122 | $remaini = $inputlen - $i; |
||
| 123 | $inputArr[$i] = \ord($inputArr[$i]); |
||
| 124 | if ($remaini > 2) { |
||
| 125 | $inputArr[$i + 1] = \ord($inputArr[$i + 1]); |
||
| 126 | $inputArr[$i + 2] = \ord($inputArr[$i + 2]); |
||
| 127 | $c0 = $inputArr[$i] >> 2; |
||
| 128 | $c1 = ((($inputArr[$i] << 6) & 0xFF) >> 2) | ($inputArr[$i + 1] >> 4); |
||
| 129 | $c2 = ((($inputArr[$i + 1] << 4) & 0xFF) >> 2) | ($inputArr[$i + 2] >> 6); |
||
| 130 | $c3 = (($inputArr[$i + 2] << 2) & 0xFF) >> 2; |
||
| 131 | if ($c0 > $bpos) { |
||
| 132 | $op[$m] = $xtag; |
||
| 133 | $op[++$m] = $b62x[$c0]; |
||
| 134 | } else { |
||
| 135 | $op[$m] = $b62x[$c0]; |
||
| 136 | } |
||
| 137 | if ($c1 > $bpos) { |
||
| 138 | $op[++$m] = $xtag; |
||
| 139 | $op[++$m] = $b62x[$c1]; |
||
| 140 | } else { |
||
| 141 | $op[++$m] = $b62x[$c1]; |
||
| 142 | } |
||
| 143 | if ($c2 > $bpos) { |
||
| 144 | $op[++$m] = $xtag; |
||
| 145 | $op[++$m] = $b62x[$c2]; |
||
| 146 | } else { |
||
| 147 | $op[++$m] = $b62x[$c2]; |
||
| 148 | } |
||
| 149 | if ($c3 > $bpos) { |
||
| 150 | $op[++$m] = $xtag; |
||
| 151 | $op[++$m] = $b62x[$c3]; |
||
| 152 | } else { |
||
| 153 | $op[++$m] = $b62x[$c3]; |
||
| 154 | } |
||
| 155 | $i += 2; |
||
| 156 | } elseif ($remaini == 2) { |
||
| 157 | $inputArr[$i + 1] = \ord($inputArr[$i + 1]); |
||
| 158 | $c0 = $inputArr[$i] >> 2; |
||
| 159 | $c1 = ((($inputArr[$i] << 6) & 0xFF) >> 2) | ($inputArr[$i + 1] >> 4); |
||
| 160 | $c2 = (($inputArr[$i + 1] << 4) & 0xFF) >> 4; |
||
| 161 | if ($c0 > $bpos) { |
||
| 162 | $op[$m] = $xtag; |
||
| 163 | $op[++$m] = $b62x[$c0]; |
||
| 164 | } else { |
||
| 165 | $op[$m] = $b62x[$c0]; |
||
| 166 | } |
||
| 167 | if ($c1 > $bpos) { |
||
| 168 | $op[++$m] = $xtag; |
||
| 169 | $op[++$m] = $b62x[$c1]; |
||
| 170 | } else { |
||
| 171 | $op[++$m] = $b62x[$c1]; |
||
| 172 | } |
||
| 173 | if ($c2 > $bpos) { |
||
| 174 | $op[++$m] = $xtag; |
||
| 175 | $op[++$m] = $b62x[$c2]; |
||
| 176 | } else { |
||
| 177 | $op[++$m] = $b62x[$c2]; |
||
| 178 | } |
||
| 179 | ++$i; |
||
| 180 | } else { // == 1 |
||
| 181 | $c0 = $inputArr[$i] >> 2; |
||
| 182 | $c1 = (($inputArr[$i] << 6) & 0xFF) >> 6; |
||
| 183 | if ($c0 > $bpos) { |
||
| 184 | $op[$m] = $xtag; |
||
| 185 | $op[++$m] = $b62x[$c0]; |
||
| 186 | } else { |
||
| 187 | $op[$m] = $b62x[$c0]; |
||
| 188 | } |
||
| 189 | if ($c1 > $bpos) { |
||
| 190 | $op[++$m] = $xtag; |
||
| 191 | $op[++$m] = $b62x[$c1]; |
||
| 192 | } else { |
||
| 193 | $op[++$m] = $b62x[$c1]; |
||
| 194 | } |
||
| 195 | } |
||
| 196 | ++$m; |
||
| 197 | } while (++$i < $inputlen); |
||
| 198 | } |
||
| 199 | $output = implode('', $op); |
||
| 200 | } |
||
| 201 | |||
| 202 | return $output; |
||
| 203 | } |
||
| 204 | |||
| 205 | // decode, obase=2,8,10,16,32... |
||
| 206 | public static function decode($input, $obase = null) |
||
| 207 | { |
||
| 208 | $output = ''; |
||
| 209 | if ($input == null || $input == '') { |
||
| 210 | return $input; |
||
| 211 | } |
||
| 212 | |||
| 213 | $codetype = 1; |
||
| 214 | $xtag = self::XTAG; |
||
| 215 | $b62x = self::b62x; |
||
| 216 | $asclist = self::asclist; |
||
| 217 | $bpos = self::bpos; |
||
| 218 | $xpos = self::xpos; |
||
| 219 | $ascmax = self::ascmax; |
||
| 220 | $rb62x = self::fillRb62x($b62x, $bpos, $xpos); |
||
| 221 | //$max_safe_base = self::max_safe_base; |
||
| 222 | |||
| 223 | $isNum = false; |
||
| 224 | if ($obase > 0) { |
||
| 225 | $isNum = true; |
||
| 226 | } |
||
| 227 | if ($isNum) { |
||
| 228 | $output = 0; |
||
|
0 ignored issues
–
show
|
|||
| 229 | $ibase = $xpos; |
||
| 230 | $num_input = self::xx2dec($input, $ibase, $rb62x); |
||
| 231 | $output = self::dec2xx($num_input, $obase, $b62x); |
||
| 232 | // why a mediate number format is needed? |
||
| 233 | } else { |
||
| 234 | // string |
||
| 235 | $ascidx = []; |
||
| 236 | $ascrlist = []; |
||
| 237 | $inputArr = mb_str_split($input); |
||
| 238 | $inputlen = \count($inputArr); |
||
| 239 | $setResult = self::setAscii($codetype, $inputArr, $ascidx, $ascmax, $asclist, $ascrlist); |
||
| 240 | $asctype = $setResult['asctype']; |
||
| 241 | $ascidx = $setResult['ascidx']; |
||
|
0 ignored issues
–
show
|
|||
| 242 | $ascrlist = $setResult['ascrlist']; |
||
| 243 | |||
| 244 | $op = []; |
||
| 245 | $i = 0; |
||
| 246 | $m = 0; |
||
| 247 | if ($asctype == 1) { |
||
| 248 | --$inputlen; |
||
| 249 | do { |
||
| 250 | if ($inputArr[$i] == $xtag) { |
||
| 251 | if ($inputArr[$i + 1] == $xtag) { |
||
| 252 | $op[$m] = $xtag; |
||
| 253 | ++$i; |
||
| 254 | } else { |
||
| 255 | $op[$m] = \chr($ascrlist[$inputArr[++$i]]); |
||
| 256 | } |
||
| 257 | } else { |
||
| 258 | $op[$m] = $inputArr[$i]; |
||
| 259 | } |
||
| 260 | ++$m; |
||
| 261 | } while (++$i < $inputlen); |
||
| 262 | } else { |
||
| 263 | $tmpArr = []; |
||
|
0 ignored issues
–
show
|
|||
| 264 | $bint = ['1' => 1, '2' => 2, '3' => 3]; |
||
| 265 | do { |
||
| 266 | $tmpArr = [null, null, null, null]; |
||
| 267 | $remaini = $inputlen - $i; |
||
| 268 | $j = 0; |
||
| 269 | if ($remaini > 1) { |
||
| 270 | $j = 0; |
||
| 271 | do { |
||
| 272 | if ($inputArr[$i] == $xtag) { |
||
| 273 | ++$i; |
||
| 274 | $tmpArr[$j] = $bpos + $bint[$inputArr[$i]]; |
||
| 275 | } else { |
||
| 276 | $tmpArr[$j] = $rb62x[$inputArr[$i]]; |
||
| 277 | } |
||
| 278 | ++$i; |
||
| 279 | ++$j; |
||
| 280 | } while ($j < 4 && $i < $inputlen); |
||
| 281 | |||
| 282 | $arr = self::_decodeByLength($tmpArr, $op, $m); |
||
| 283 | $op = $arr[0]; |
||
| 284 | $m = $arr[1]; //- deprecated |
||
| 285 | } else { |
||
| 286 | error_log(__FILE__.': found illegal base62x input:['.$inputArr[$i].']. 1608091042.'); |
||
| 287 | ++$i; |
||
| 288 | continue; |
||
| 289 | } |
||
| 290 | ++$m; |
||
| 291 | } while ($i < $inputlen); |
||
| 292 | } |
||
| 293 | $output = implode('', $op); |
||
| 294 | } |
||
| 295 | |||
| 296 | return $output; |
||
| 297 | } |
||
| 298 | |||
| 299 | // xx2dec |
||
| 300 | public static function xx2dec($inum, $ibase, $ridx) |
||
| 301 | { |
||
| 302 | $onum = 0; |
||
| 303 | $obase = 10; |
||
| 304 | $xtag = self::XTAG; |
||
| 305 | $bpos = self::bpos; |
||
| 306 | $safebase = self::max_safe_base; |
||
| 307 | $base59 = self::base59; |
||
| 308 | $xpos = self::xpos; |
||
| 309 | if ($ibase <= $safebase) { |
||
| 310 | $onum = base_convert($inum, $ibase, $obase); |
||
| 311 | } else { |
||
| 312 | if ($ibase > $base59 && $ibase < $xpos) { |
||
| 313 | // base 60, 61, 62 or sth, reset ridx table |
||
| 314 | //$ridx = $self->rb62xyz; |
||
| 315 | $ridx_in = []; |
||
| 316 | foreach ($ridx as $rk => $rv) { |
||
| 317 | $ridx_in[$rk] = $rv; |
||
| 318 | } |
||
| 319 | $ridx_in['x'] = 59; |
||
| 320 | $ridx_in['y'] = 60; |
||
| 321 | $ridx_in['z'] = 61; |
||
| 322 | $ridx = $ridx_in; |
||
| 323 | } |
||
| 324 | $iArr = mb_str_split($inum); |
||
| 325 | $iArr = array_reverse($iArr); |
||
| 326 | $arrLen = \count($iArr); |
||
| 327 | $xnum = 0; |
||
| 328 | $isBase62x = ($ibase == $xpos); |
||
| 329 | for ($i = 0; $i < $arrLen; ++$i) { |
||
| 330 | if ($isBase62x && $iArr[$i + 1] == $xtag) { |
||
| 331 | $tmpi = $bpos + $ridx[$iArr[$i]]; |
||
| 332 | ++$xnum; |
||
| 333 | ++$i; |
||
| 334 | } else { |
||
| 335 | $tmpi = $ridx[$iArr[$i]]; |
||
| 336 | } |
||
| 337 | if ($tmpi >= $ibase) { |
||
| 338 | error_log(__FILE__.": xxdec found out of radix:$tmpi for base:$ibase.\n"); |
||
| 339 | $tmpi = $ibase - 1; |
||
| 340 | } |
||
| 341 | $onum = $onum + $tmpi * $ibase ** ($i - $xnum); |
||
| 342 | //error_log("\t".__FILE__.": xx2dec ibase:$ibase i:$i c:".$iArr[$i]." tmpi:$tmpi onum:$onum xnum:$xnum"); |
||
| 343 | } |
||
| 344 | if (mb_strpos($onum, 'E') !== false) { |
||
| 345 | error_log(__FILE__.": Base62x::xx2dec: lost precision due to too large number:[$onum]. consider using bc math. 1610072145."); |
||
| 346 | $onum = number_format($onum); |
||
| 347 | } |
||
| 348 | } |
||
| 349 | //error_log(__FILE__.": xx2dec: in:$inum ibase:$ibase outindec:".$onum); |
||
| 350 | return $onum; |
||
| 351 | } |
||
| 352 | |||
| 353 | // dec2xx |
||
| 354 | public static function dec2xx($inum, $obase, $idx) |
||
| 355 | { |
||
| 356 | $onum = 0; |
||
| 357 | $ibase = 10; |
||
| 358 | $xtag = self::XTAG; |
||
| 359 | $bpos = self::bpos; |
||
| 360 | $safebase = self::max_safe_base; |
||
| 361 | $base59 = self::base59; |
||
| 362 | $xpos = self::xpos; |
||
| 363 | if ($obase <= $safebase) { |
||
| 364 | $onum = base_convert($inum, $ibase, $obase); |
||
| 365 | } else { |
||
| 366 | $isBase62x = false; |
||
| 367 | if ($obase > $base59 && $obase < $xpos) { |
||
| 368 | //$idx = self::b62xyz; |
||
| 369 | $idx_in = []; |
||
| 370 | foreach ($idx as $ik => $iv) { |
||
| 371 | $idx_in[$ik] = $iv; |
||
| 372 | } |
||
| 373 | $idx_in[59] = 'x'; |
||
| 374 | $idx_in[60] = 'y'; |
||
| 375 | $idx_in[61] = 'z'; |
||
| 376 | $idx = $idx_in; |
||
| 377 | } elseif ($obase == $xpos) { |
||
| 378 | $isBase62x = true; |
||
| 379 | } |
||
| 380 | $maxPos = $bpos; |
||
| 381 | if (!$isBase62x) { |
||
| 382 | $maxPos = $bpos + 1; |
||
| 383 | } // cover all 0-61 chars |
||
| 384 | $i = 0; |
||
| 385 | $b = 0; |
||
| 386 | $oArr = []; |
||
| 387 | while ($inum >= $obase) { |
||
| 388 | $b = $inum % $obase; |
||
| 389 | $inum = floor($inum / $obase); |
||
| 390 | if ($b <= $maxPos) { |
||
| 391 | $oArr[$i++] = $idx[$b]; |
||
| 392 | } else { |
||
| 393 | $oArr[$i++] = $idx[$b - $bpos]; |
||
| 394 | $oArr[$i++] = $xtag; |
||
| 395 | } |
||
| 396 | } |
||
| 397 | $b = $inum; |
||
| 398 | if ($b > 0) { |
||
| 399 | if ($b <= $maxPos) { |
||
| 400 | $oArr[$i++] = $idx[$b]; |
||
| 401 | } else { |
||
| 402 | $oArr[$i++] = $idx[$b - $bpos]; |
||
| 403 | $oArr[$i++] = $xtag; |
||
| 404 | } |
||
| 405 | } |
||
| 406 | $oArr = array_reverse($oArr); |
||
| 407 | //print_r($oArr); |
||
| 408 | $onum = implode('', $oArr); |
||
| 409 | } |
||
| 410 | //error_log(__FILE__.": dec2xx: inindec:$inum obase:$obase out:".($onum)); |
||
| 411 | return $onum; |
||
| 412 | } |
||
| 413 | |||
| 414 | // inner faciliates |
||
| 415 | |||
| 416 | // fill reverse b62x |
||
| 417 | private static function fillRb62x($b62x, $bpos, $xpos) |
||
| 418 | { |
||
| 419 | $rb62x = []; |
||
| 420 | for ($i = 0; $i <= $xpos; ++$i) { |
||
| 421 | if ($i > $bpos && $i < $xpos) { |
||
| 422 | // omit x1, x2, x3 |
||
| 423 | } else { |
||
| 424 | $rb62x[$b62x[$i]] = $i; |
||
| 425 | } |
||
| 426 | } |
||
| 427 | |||
| 428 | return $rb62x; |
||
| 429 | } |
||
| 430 | |||
| 431 | // set ascii type |
||
| 432 | private static function setAscii($codetype, $inputArr, $ascidx, $ascmax, $asclist, $ascrlist) |
||
| 433 | { |
||
| 434 | $ret = []; |
||
| 435 | |||
| 436 | $asctype = 0; |
||
| 437 | $xtag = self::XTAG; |
||
| 438 | $inputlen = \count($inputArr); |
||
| 439 | if ($codetype == 0 && \ord($inputArr[0]) <= $ascmax) { |
||
| 440 | $asctype = 1; |
||
| 441 | for ($i = 1; $i < $inputlen; ++$i) { |
||
| 442 | $tmpi = \ord($inputArr[$i]); |
||
| 443 | if ($tmpi > $ascmax |
||
| 444 | || ($tmpi > 16 && $tmpi < 21) // DC1-4 |
||
| 445 | || ($tmpi > 27 && $tmpi < 32)) { // FC, GS, RS, US |
||
| 446 | $asctype = 0; |
||
| 447 | break; |
||
| 448 | } |
||
| 449 | } |
||
| 450 | } elseif ($codetype == 1 && $inputArr[$inputlen - 1] == $xtag) { |
||
| 451 | $asctype = 1; |
||
| 452 | } |
||
| 453 | $ret['asctype'] = $asctype; |
||
| 454 | |||
| 455 | if ($asctype == 1) { |
||
| 456 | for ($i = 0; $i <= $ascmax; ++$i) { |
||
| 457 | $ascidx[$i] = -1; |
||
| 458 | } |
||
| 459 | $idxi = 0; |
||
| 460 | $bgnArr = [0, 21, 32, 58, 91, 123]; |
||
| 461 | $endArr = [17, 28, 48, 65, 97, $ascmax + 1]; |
||
| 462 | foreach ($bgnArr as $k => $v) { |
||
| 463 | for ($i = $v; $i < $endArr[$k]; ++$i) { |
||
| 464 | $ascidx[$i] = $asclist[$idxi]; |
||
| 465 | $ascrlist[$asclist[$idxi]] = $i; |
||
| 466 | ++$idxi; |
||
| 467 | } |
||
| 468 | } |
||
| 469 | } |
||
| 470 | |||
| 471 | $ret['ascidx'] = $ascidx; |
||
| 472 | $ret['ascrlist'] = $ascrlist; |
||
| 473 | |||
| 474 | return $ret; |
||
| 475 | } |
||
| 476 | |||
| 477 | //- decode with x1, x2, x3 |
||
| 478 | //- Mon Nov 28 17:47:45 CST 2016 |
||
| 479 | private static function _decodeByLength($tmpArr, $op, $m) |
||
| 480 | { |
||
| 481 | $rtn = $op; |
||
|
0 ignored issues
–
show
|
|||
| 482 | $c0 = 0; |
||
| 483 | $c1 = 0; |
||
| 484 | $c2 = 0; |
||
|
0 ignored issues
–
show
|
|||
| 485 | if ($tmpArr[3] !== null) { |
||
| 486 | $c0 = $tmpArr[0] << 2 | $tmpArr[1] >> 4; |
||
| 487 | $c1 = (($tmpArr[1] << 4) & 0xF0) | ($tmpArr[2] >> 2); |
||
| 488 | $c2 = (($tmpArr[2] << 6) & 0xFF) | $tmpArr[3]; |
||
| 489 | $op[$m] = \chr($c0); |
||
| 490 | $op[++$m] = \chr($c1); |
||
| 491 | $op[++$m] = \chr($c2); |
||
| 492 | } elseif ($tmpArr[2] !== null) { |
||
| 493 | $c0 = $tmpArr[0] << 2 | $tmpArr[1] >> 4; |
||
| 494 | $c1 = (($tmpArr[1] << 4) & 0xF0) | $tmpArr[2]; |
||
| 495 | $op[$m] = \chr($c0); |
||
| 496 | $op[++$m] = \chr($c1); |
||
| 497 | } elseif ($tmpArr[1] !== null) { |
||
| 498 | $c0 = $tmpArr[0] << 2 | $tmpArr[1]; |
||
| 499 | $op[$m] = \chr($c0); |
||
| 500 | } else { |
||
| 501 | $c0 = $tmpArr[0]; |
||
| 502 | $op[$m] = \chr($c0); |
||
| 503 | } |
||
| 504 | |||
| 505 | return [$rtn = $op, $m]; |
||
| 506 | } |
||
| 507 | } |
||
| 508 |