tekst-encodercompressor

Gesponsorde koppelingen

PHP script bestanden

  1. tekst-encodercompressor

« Lees de omschrijving en reacties

De encoder:

VERSIE 1.00 beta
livc.php

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
<?php
class livc {

    var
$AddVersionHeader=true;
    var
$DebugEncodingEnabled=false;
    var
$DebugDecodingEnabled=false;
    var
$version = 1;
    var
$debug = 'Enable debug or encode a string first.';
    var
$debugstring = '';
    var
$binstring = '';
    var
$decodebinpos = 0;
    var
$decodeindexbits = 0;
    var
$decodebinversion = 0;
    var
$datalength = 0;
    //array(MATCHREGEX,LENGTHBITS,TYPE,DATA)
    /*
    MATCHREGEX = REQUIRED / preg_match regular expression >>>MUST ONLY MATCH FROM THE BEGINNING OF THE STRING!<<<
    LENGTHBITS = REQUIRED / getal die aangeeft hoeveel bits er gebruikt wordt om de lengte van de string op te geven. indien 0 wordt er gewacht op een END bit, alleen mogelijk met TYPE = 0.
    TYPE = REQUIRED / OPTION / INT
        -1 = No compression
                DATA = null
        0 = basic translation
                DATA = REQUIRED / array (ID => CHARACTER)
        1 = ipv4 adress
    DATA = TYPE-specific data, see 'TYPE'
    
    TRANSLATIONTABLE bevat array's met daarin alle vertalingsregels in array's. Er zijn verschillende soorten vertalingen.
    
        ARRAY OPBOUW: ARRAY(MATCHREGEX,LENGTHBITS-LENGTH,TRANSLATIONTYPE,TRANSLATIONDATA);
    
        MATCHREGEX
            Bij deze waarde moet je een volledige regular expression invoeren. Deze regex moet werken met de PREG_MATCH functie.
            Let erop, bij het maken van de regex, dat de regex aan de volgende voorwaarden moet voldoen:
                Hij MOET aan het begin van de invoer matchen!
                Hij MOET minimaal 1 teken machen
                Indien er een maximum lengte geldt (zie LENGTH/TRANSLATIONTYPE) zorg er dan voor dat de REGEX geen langere string matcht!
    
        TRANSLATIONTYPE = -1
            Bij deze TRANSLATIONTYPE wordt de data NIET ingepakt. Tekens blijven 8 bits per teken. Enkel te gebruiken als worst-case-solution, omdat deze manier meer ruimte inneemt dan niet-comprimeren.
            De lengte moet opgegeven worden in LENGTHBITS-LENGTH, waarin staat hoeveel bits er gebruikt worden om de lengte van de string aan te geven.
        TRANSLATIONTYPE = 0
            Bij deze TRANSLATIONTYPE moet er een tabel aangegeven worden in TRANSLATIONDATA, bestaande uit een array.
            In deze ARRAY moeten alle gewenste tekens in deze groep gezet worden, eventueel met een END teken.
            Er zijn 2 manieren om de lengte te bepalen.
                LENGTH = 0
                    Bij deze lengte, 0 dus, worden er geen LENGTH-BITS gebruikt. Dit bespaard je dus een aantal LENGTH-BITS.
                    In plaats van de lengte op te geven MOET er in de tekentabel een teken voorkomen bestaande uit de string 'END'.
                    Wanneer de decoder dit teken tegenkomt weet-ie dus dat de string stopt. Het voordeel van deze manier is dat het
                    minder bits inneemt bij langere strings. Het nadeel is wel dat er ook aanzienlijk meer rekenwerk bij komt voor de decoder om naar de END bit te zoeken.
                    Een END bit kost evenveel bits als een normaal teken in de tabel.
                LENGTH = 1 of hoger
                    Bij deze lengte geef je aan hoeveel bits er verbruikt zal worden om de lengte van de string aan te geven.
                    Je kan uitrekenen hoe lang een string maximaal kan zijn door 2-tot-de-LENGTH in je rekenmachine in te tikken.
                    Bijvoorbeeld, bij een LENGTH van 4 bits kan een string maximaal 16 tekens lang zijn. Immers, 2 tot de 4e is 16 op mijn rekenmachine.
            TRANSLATIONDATA = ARRAY()
                In TRANSLATIONDATA hoort een array te staan met alle mogelijke tekens. Hoe minder tekens er in een tabel staan,
                hoe minder bits deze tekens zullen verbruiken wanneer deze tabel gebruikt zal worden. Indien er een END-bit verwacht wordt (bij LENGTH = 0)
                MOET deze ook in de array vermeldt worden. Iedere keer dat het aantal tekens in de tabel groter wordt dan een macht van 2 wordt de lengte van 1 teken ook een bit groter.
                Wanneer een tabel dus 8 tekens heeft zal 1 teken 3 bits innemen (2^3 = 8). Zodra er 9 tekens in een tabel is het hoger dan 2^3 en zal 1 teken uit deze tabel 4 bits per stuk innemen.
                Pas wanneer er dan weer meer dan 2^4=16 tekens in de tabel staan neemt 1 teken 5 bits in. Het is daarom verstandig om een tabel op te vullen tot een aantal dat gelijk is aan een macht
                van 2. Machten van 2 zijn: 2,4,8,16,32,64,128 en 256. Meer dan 256 tekens in een tabel zal niet nodig zijn, aangezien ongecomprimeerde data al uit 8bits bestaan. (dus 256 tekens.)
        
    LET OP: er kunnen maximaal 32 array's in TRANSLATIONTABLE staan. EDIT: er kunnen nu ook meer dan 32 array's in de translationtable staan.
    */

    var $translationtable = array(
        array('/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/',0,1),
        array('/^[0-9\.,\-+ ]{1,16}/',4,0,array('0','1','2','3','4','5','6','7','8','9','.',',','-','+',' ')),
        array('/^[\r\n ]{4,}/',0,0,array("\n","\r",' ','END')),//space, \r en \n en TAB
        array('/^[\r\n     ]{1,4}/',2,0,array("\n","\r",' ','    ')),//space, \r en \n
        array('/^[a-z \n\r:]{8,64}/',6,0,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","\n",':')),
        array('/^[a-z \n\r:]{1,8}/',3,0,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","\n",':')),
        array('/^[A-Z \n\r:]{8,64}/',6,0,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","\n",':')),
        array('/^[A-Z \n\r:]{1,8}/',3,0,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","\n",':')),
        array('/^(?:[^a-z0-9 \n\r]?.??.??[^a-z0-9 \n\r]|[^a-z0-9 \n\r].??.??[^a-z0-9 \n\r]?+)/s',2,-1),
    );
    
    function
livc_encode($str) {
        if($this->DebugEncodingEnabled) {$this->debug = '';$this->datalength = 0;}
        $bin = '';
        
        //voeg versie toe (1-5 bits)
        $bin .= $this->livc_create_version_headers();
          if($this->DebugEncodingEnabled) $this->debug .= '<span style="color:#fff;background-color:#080;" title="'.utf8($this->debugstring).'">'.ostr($this->livc_create_version_headers()).'</span>';
        
        //geef aan uit hoeveel bits een tekenindex (translationtable-ID) bestaat (indexbitslength bits)
        $indexbits = strlen(decbin(count($this->translationtable)-1));
        
        $strpos = 0;
        
        while($strpos<strlen($str)) {
            //converteer text
            $stop = false;
            foreach($this->translationtable as $key=>$table) {
                if(!$stop && preg_match($table[0],substr($str,$strpos),$matches)) {
                      if(strlen($matches[0])==0) {user_error('\''.$table[0].'\' matched 0-length string. At least one character is required to match!',E_USER_ERROR);}
                    $stop = true;
                    $strpos+=strlen($matches[0]);
                    
                    $bin.=decbin_fix($key,$indexbits);
                      if($this->DebugEncodingEnabled) $this->debug .= '<span style="color:#FFF;background-color:#088;" title="translationtype: '.$key.'">'.ostr(decbin_fix($key,$indexbits)).'</span>';
                    
                    if($table[1]>0) {
                        $bin.=decbin_fix(strlen($matches[0])-1,$table[1]);
                          if($this->DebugEncodingEnabled) $this->debug .= '<span style="color:#FFF;background-color:#00F;" title="length: '.strlen($matches[0]).'">'.ostr(decbin_fix(strlen($matches[0])-1,$table[1])).'</span>';
                    }

                    
                    if($table[2]==0) {//table-based translation
                        $chars = str_split($matches[0],1);
                        $newbin = '';
                        foreach($chars as $char) {
                            $newbin .= decbin_fix(array_search($char,$table[3],true),strlen(decbin(count($table[3])-1)));
                        }
                    }
elseif($table[2]==1) {//ipv4 adress
                        $chars = explode('.',$matches[0]);
                        $newbin = '';
                        foreach($chars as $char) {
                            $newbin .= decbin_fix($char,8);
                        }
                    }
else {
                        $newbin = str2bin($matches[0]);
                    }

                    
                    $bin.=$newbin;
                      if($this->DebugEncodingEnabled) $this->debug .= '<span style="color:#000;background-color:#ddd;" title="'.utf8($matches[0]).'">'.ostr($newbin).'</span>';
                      if($this->DebugEncodingEnabled) $this->datalength += strlen($newbin);
                    
                    if($table[1]==0 && $table[2]==0) {
                        $bin.= decbin_fix(array_search('END',$table[3],true),strlen(decbin(count($table[3])-1)));
                          if($this->DebugEncodingEnabled) $this->debug .= '<span style="color:#000;background-color:#F80;" title="END bit">'.ostr(decbin_fix(array_search('END',$table[3],true),strlen(decbin(count($table[3])-1)))).'</span>';
                    }
                }
            }

            
            if(!$stop) {user_error('encoding failed: no regex match found for use on \''.substr($str,$strpos).'\'.',E_USER_ERROR);}
        }

        
        return $bin;
    }
    
    function
livc_decode($bin) {
          if($this->DebugDecodingEnabled) $this->debug = '';
        $this->decodebinpos = 0;
        $this->binstring = $bin;
        $this->debugstring = '';
        $str = '';
        if($this->livc_read(1)=='1') {
              if($this->DebugDecodingEnabled) $this->debug .= '<span style="color:#fff;background-color:#080;" title = "version '.($this->livc_decread(4,true)+1).'">1'.ostr($this->livc_read(4,true)).'</span>';
            $this->decodebinversion = $this->livc_decread(4)+1;
        }
else {
              if($this->DebugDecodingEnabled) $this->debug .= '<span style="color:#fff;background-color:#080;" title = "version unknown">0</span>';
            $this->decodebinversion = 0;
        }

        
        //geef aan uit hoeveel bits een tekenindex (translationtable-ID) bestaat (indexbitslength bits)
        $this->decodeindexbits = strlen(decbin(count($this->translationtable)-1));
        while(strlen($bin)>$this->decodebinpos) {
              if($this->DebugDecodingEnabled) $this->debug .= '<span style="color:#FFF;background-color:#088;" title="translationtype: '.($this->livc_decread($this->decodeindexbits,true)).'">'.ostr($this->livc_read($this->decodeindexbits,true)).'</span>';
            $translationtype = $this->livc_decread($this->decodeindexbits);
            if($this->translationtable[$translationtype][1]>0) {
                  if($this->DebugDecodingEnabled) $this->debug .= '<span style="color:#FFF;background-color:#00F;" title="characters: '.($this->livc_decread($this->translationtable[$translationtype][1],true)+1).'">'.ostr($this->livc_read($this->translationtable[$translationtype][1],true)).'</span>';
                $length = $this->livc_decread($this->translationtable[$translationtype][1])+1;                
            }
else {
                $length = 0;//characterscount, not characterlength!            
            }
            $a = 0;
            if($this->translationtable[$translationtype][2]==1) {//ipv4 adres
                
                $char = $this->livc_read(32);
                  if($this->DebugDecodingEnabled) $this->debugstring = $char;
                
                $char = str_split($char,8);
                
                $newstr = bindec($char[0]).'.'.bindec($char[1]).'.'.bindec($char[2]).'.'.bindec($char[3]);
                
                  if($this->DebugDecodingEnabled) $this->debug .= '<span style="color:#000;background-color:#ddd;" title="'.utf8($newstr).'">'.ostr($this->debugstring).'</span>';
                $str .= $newstr;
                
            }
elseif($this->translationtable[$translationtype][2]==0 && $length == 0) {
                do {
                    $characterlength = strlen(decbin(count($this->translationtable[$translationtype][3])-1));
                      if($this->DebugDecodingEnabled) $this->debugstring = $this->livc_read($characterlength,true);
                    $char = $this->translationtable[$translationtype][3][$this->livc_decread($characterlength)];
                    if($char !== 'END') {
                          if($this->DebugDecodingEnabled) $this->debug .= '<span style="color:#000;background-color:#ddd;" title="'.utf8($char).'">'.ostr($this->debugstring).'</span>';
                        $str .= $char;
                    }
elseif($this->DebugDecodingEnabled) $this->debug .= '<span style="color:#000;background-color:#F80;" title="END bit">'.ostr($this->debugstring).'</span>';
                    if(strlen($bin)<$this->decodebinpos) {
                        if(!$stop) {user_error('decoding failed: unexpected end of string. Expecting END-bit of translationtable '.$translationtype,E_USER_WARNING);return;}
                    }
                }
while($char !== 'END');
            }
else {
                if($this->translationtable[$translationtype][2]==0) {
                    $characterlength = strlen(decbin(count($this->translationtable[$translationtype][3])-1));
                }
else {
                    $characterlength = 8;
                }

                  if($this->DebugDecodingEnabled) $this->debugstring = $this->livc_read($length*$characterlength,true);
                $characters = str_split($this->livc_read($length*$characterlength),$characterlength);
                $newstr = '';
                foreach($characters as $char) {
                    
                    if($this->translationtable[$translationtype][2]==0) {
                        $newstr .= $this->translationtable[$translationtype][3][bindec($char)];
                    }
else {
                        $newstr .= chr(bindec($char));
                    }
                    
                }

                  if($this->DebugDecodingEnabled) $this->debug .= '<span style="color:#000;background-color:#ddd;" title="'.utf8($newstr).'">'.ostr($this->debugstring).'</span>';
                $str .= $newstr;
            }
            
        }

        
        return $str;
    }
    
    function
livc_create_version_headers() {
        if($this->AddVersionHeader) {
              if($this->DebugEncodingEnabled) $this->debugstring = 'version '.$this->version;
            return '1'.decbin_fix($this->version-1,4);
        }
else {
              if($this->DebugEncodingEnabled) $this->debugstring = 'no version header';
            return '0';
        }
    }

    
    //functie die binaire string leest vanaf de laatst gelezen positie.
    function livc_read($length = 1,$nobinposmoving = false) {
        $bin = substr($this->binstring,$this->decodebinpos,$length);
        if(!$nobinposmoving) {
            $this->decodebinpos += $length;
        }

        return $bin;
    }

    
    //functie die binaire string leest vanaf de laatst gelezen positie en deze string omzet in een decimaal getal.
    function livc_decread($length = 1,$nobinposmoving = false) {
        return bindec($this->livc_read($length,$nobinposmoving));
    }
    
}


//functie die een string omzet in binair.
function str2bin($str) {
    $array = str_split($str,1);
    $bin = '';
    foreach($array as $chr) {
        $bin.=decbin_fix(ord($chr));
    }

    return $bin;
}


//functie die een binaire string omzet in een string.
function bin2str($bin) {
    $array = str_split($bin,8);
    $str = '';
    foreach($array as $chr) {
        $str.=chr(bindec($chr));
    }

    return $str;
}


//functie die een binaire string 'breekbaar' maakt
function ostr($bin,$char = '<wbr>') {
    return str_replace(array('0','1'),array('0'.$char,'1'.$char),$bin);
}


//functie die een getal omzet in een binair getal en deze links aanvult met het opgegeven aantal 0-en.
function decbin_fix($int,$length = 8) {
      if(strlen(decbin($int))>$length) {$dbg=debug_backtrace();user_error('output string contains more characters than allowed. inputstring: '.$int.', outputstring: '.decbin($int).' width allowed length: '.$length.'. Function called @ <strong>'.$dbg[0]['file'].':'.$dbg[0]['line'].'</strong>. Error occurred ',E_USER_ERROR);}
    return str_pad(decbin($int),$length,'0',STR_PAD_LEFT);
}

function
utf8($str) {
    return htmlentities($str,ENT_QUOTES,'UTF-8');
}

?>


werking:

start class:
$livc = new livc;

encode string: (inpakken)
$encoded = $livc->livc_encode($string);

decode binairy string: (uitpakken)
$decoded = $livc->livc_decode($binstring);

code voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
108
109
110
111
112
<?php
include('livc.php');
$livc = new livc;
$livc->DebugEncodingEnabled = !$_POST['disableencodingdebug'];
$livc->DebugDecodingEnabled = !$_POST['disabledecodingdebug'];
$livc->AddVersionHeader = $_POST['AddVersionHeader'];

  $stime = microtime(true);
$encoded=$livc->livc_encode(stripslashes($_POST['query']));
  $encodingdebug = $livc->debug;
  $encodetime = microtime(true) - $stime;
  $stime = microtime(true);
$decoded=$livc->livc_decode($encoded);
  $decodingdebug = $livc->debug;
  $decodetime = microtime(true) - $stime;
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>livC-compressor 1.00 beta</title>
<style type="text/css">
body {
    background:#acf;
    color:#008;
}
* {
    font-size:12px;    
    font-family:courier new, courier;    
}
#page {
    width:800px;
    height:720px;
    margin:0px auto;
}
#input {
    border:1px solid #008;
    width:800px;
}
.query {
    width:794px;
    height:200px;
    margin:0px;
    padding:2px;
}
#debug {
    border:1px solid #008;
    overflow:auto;
    background-color:#fff;
}
#submit {
    width:800px;
}
#debug span {
    border:1px solid #000;
    border-width:0px 2px 0px 0px;
    cursor:default;
}
#debug span:hover {
    background:#888 !important;
    color:#fff !important;
}
</style>
</head>
<body>
<div id="page">


<div id="input">
<form method="POST" action="index.php">
<pre>
INPUT STRING SIZE:   <?php echo strlen(stripslashes($_POST['query']));?> bytes
ENCODED STRING SIZE: <?php echo strlen($encoded)/8;?> bytes
DECODED STRING SIZE: <?php echo strlen($decoded);?> bytes
COMPRESSION RATIO:   <?php @$p=intval(((strlen($encoded)/8)/strlen(stripslashes($_POST['query']))*100*10))/10;echo $p;?> %
COMPRESSION STATUS:  <?php if(stripslashes($_POST['query'])==$decoded) {echo '<span style="color:#080;">SUCCES</span>';} else {echo '<span style="color:#F00;">FAIL</span>';}echo "\r\n";?>
ENCODING TIME:       <?php echo round($encodetime*1000,3);?> ms <?php if($livc->DebugEncodingEnabled) {echo '<span style="color:#f80;background-color:#444;">Warning: Encoding takes more time with debug enabled.</span>';} echo "\r\n";?>
DECODING TIME:       <?php echo round($decodetime*1000,3);?> ms <?php if($livc->DebugDecodingEnabled) {echo '<span style="color:#f80;background-color:#444;">Warning: Decoding takes more time with debug enabled.</span>';} echo "\r\n";?>
</pre>
<img src="compression.php?p=<?php echo $p;?>"/>
<table width="100%">
    <tr>
        <td><input type="checkbox" name="AddVersionHeader" <?php if($_POST['AddVersionHeader']) echo 'checked="checked"';?> value="true"/></td>
        <td>Add version header</td>
        <td><input type="checkbox" name="disableencodingdebug" <?php if($_POST['disableencodingdebug']) echo 'checked="checked"';?> value="true"/></td>
        <td>Disable Encoding debug</td>
        <td><input type="checkbox" name="disabledecodingdebug" <?php if($_POST['disabledecodingdebug']) echo 'checked="checked"';?> value="true"/></td>
        <td>Disable Decoding debug</td>
        <td></td>
        <td></td>
    </tr>
    <tr>
    </tr>
</table>
<input type="submit" id="submit" value="RUN ENCODE AND DECODE"/>
INPUT
<textarea class="query" style="height:120px;" name="query"><?php echo utf8(stripslashes($_POST['query']));?></textarea>
</form>
<?php if($livc->DebugEncodingEnabled) { ?>
ENCODING DEBUG STRING
<div class="query" id="debug"><?php echo $encodingdebug;?></div>
<?php } else { ?>
ENCODED BINARY STRING
<textarea class="query" style="height:120px;"><?php echo ostr($encoded,'&#8203;');?></textarea>
<?php } ?>
<?php if($livc->DebugDecodingEnabled) { ?>
DECODING DEBUG STRING
<div class="query" id="debug"><?php echo $decodingdebug;?></div>
<?php } ?>
DECODED BINARY STRING
<textarea class="query" style="height:120px;"><?php echo utf8($decoded);?></textarea>
</body>
</html>

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.