-
Notifications
You must be signed in to change notification settings - Fork 5
/
base128.php
107 lines (93 loc) · 2.85 KB
/
base128.php
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
/*
* ***********************************************************************
* Copyright © Erich Pribitzer 2012
*
* This file is part of base128
base128 is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Cmsfromscratch is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Cmsfromscratch. If not, see <http://www.gnu.org/licenses/>.
***********************************************************************
*/
$buffer="Encode the World\xC3\xB6\xC4\xA6";
echo "Base128 encoding:\n";
$x=base128::encode($buffer);
echo $x."\n\n";
echo "Base128 decoding:\n";
$y=base128::decode($x);
echo $y."\n\n";
class base128
{
// iso 8859-1 removed chars <>?'"`+&/\
private static $ascii='!#$%()*,.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎ';
public function encode ($buffer)
{
return self::encode_custom($buffer,self::$ascii);
}
public function decode($buffer)
{
return self::decode_custom($buffer,self::$ascii);
}
public function encode_custom($buffer,$ascii)
{
$size=strlen($buffer);
$size++; // add an empty byte to the end
$ls=0;
$rs=7;
$r=0;
$encoded="";
for($inx=0;$inx<$size;$inx++)
{
if($ls>7)
{
$inx--;
$ls=0;
$rs=7;
}
$nc=ord(substr($buffer,$inx,1));
$r1=$nc; // save $nc
$nc=($nc<<$ls); // shift left for $rs
$nc=($nc & 0x7f)|$r; // OR carry bits
$r=($r1>>$rs) & 0x7F; // shift right and save carry bits
$ls++;
$rs--;
$encoded.=substr($ascii,$nc,1);
}
return $encoded;
}
public function decode_custom($buffer,$ascii)
{
$size=strlen($buffer);
$rs=8;
$ls=7;
$r=0;
$decoded="";
for($inx=0;$inx<$size;$inx++)
{
$nc=strpos($ascii,substr($buffer,$inx,1));
if($rs>7)
{
$rs=1;
$ls=7;
$r=$nc;
continue;
}
$r1=$nc;
$nc=($nc<<$ls) & 0xFF;
$nc=$nc|$r;
$r=$r1>>$rs;
$rs++;
$ls--;
$decoded.=chr($nc);
}
return $decoded;
}
}
?>