base64.js)
Demo der Klasse.-----BEGIN demo block----- info: blabla SGFsbG8gV2VsdA== -----END demo block-----Das Interface:
| Eigenschaften | Beschreibung |
| Title | Blocktitel, der beim letzten Dekodieren gelesen wurde. |
| Remark | Kommentar, der beim letzten Dekodieren gelesen wurde. Bei mehrzeiligem Kommentar werden die Zeilen TAB-getrennt. |
| Methoden | |
| Columns() | Base64-Zeilenlänge (Default: 76). Parameter:
|
| SetData() | Definition der Base64- bzw. Originaldaten. Parameter:
|
| Encode() | Konvertiert die Originaldaten und liefert sie als String im Base64-Format. |
| Decode() | Konvertiert die Base64-Daten in ihr Originalformat und liefert sie als String. Versorgt die Eigenschaften Title und Remark. |
Modul-Code:Base64 = function() {
var self=this,cons=this.constructor;
var Data='',Len=0,Ptr=0,Cols=76;
function init() { for (var i=0;i<64;i++) cons.AlphR[cons.Alph[i]]=i; }
function read() { if (Ptr>=Len) return -1; return Data.charCodeAt(Ptr++)&0xff; }
function readR() {
while (true) { if (Ptr>=Len) return -1;
var c=Data.charAt(Ptr++); if (cons.AlphR[c]) return cons.AlphR[c];
if (c=='A') return 0; if (c>' ') return -1;
}
}
function getLi() {
var i=Data.indexOf('\n',Ptr),p=Ptr;
if (i>-1) { Ptr=i+1; return Data.slice(p,i); }
Ptr=Len; return Data.slice(p);
}
function unwrap() {
var s,pd0=0,b=1; self.Title=self.Remark='';
while (b) {
if ((s=getLi()).length) { if (b!=1) continue;
if (s.charCodeAt(0)!=45) { Ptr=0; return; }
if (s.substring(0,10)!='-----BEGIN') { Len=0; return; }
self.Title=s.substr(11,s.length-16); pd0=Ptr; b=2;
} else { if (b==1) { pd0=Ptr; continue; } if (Ptr>=Len) break;
self.Remark=Data.slice(pd0,Ptr-1).replace(/\n/,'\t'); return;
} if (Ptr>=Len) b=0;
} Ptr=pd0;
}
function ntos(n) { n=n.toString(16); if (n.length==1) n='0'+n; return unescape('%'+n); }
init();
this.Columns = function(c) { if (c) Cols=Math.min(Math.max(c&=0xfc,64),76); return Cols; }
this.Title='';
this.Remark='';
this.SetData = function(dat,tit,rem) {
Len=(Data=dat).length,Ptr=0; this.Title=tit||''; this.Remark=rem||'';
}
this.Encode = function() {
var res='',buf=new Array(3),ncol=0,done=false;
if (this.Title) { res='-----BEGIN '+this.Title+'-----\n';
if (this.Remark) res+=this.Remark+'\n\n'; }
if (!Len) return res;
while (!done&&(buf[0]=read())!=-1) {
buf[1]=read(); buf[2]=read(); res+=(cons.Alph[buf[0]>>2]);
if (buf[1]!=-1) { res+=(cons.Alph[((buf[0]<<4)&0x30)|(buf[1]>>4)]);
if (buf[2]!=-1) {
res+=(cons.Alph[((buf[1]<<2)&0x3c)|(buf[2]>>6)]);
res+=(cons.Alph[buf[2]&0x3F]);
} else { res+=(cons.Alph[((buf[1]<<2)&0x3c)]); res+='='; done=true; }
} else { res+=(cons.Alph[((buf[0]<<4)&0x30)]); res+='=='; done=true; }
if ((ncol+=4)>=Cols&&Ptr<Len) { res+='\n'; ncol=0; }
} if (this.Title) res+='\n-----END '+this.Title+'-----\n'; return res;
}
this.Decode = function() {
if (!Len) return ''; unwrap();
var res='',buf=new Array(4),done=false;
while (!done&&(buf[0]=readR())!=-1&&(buf[1]=readR())!=-1) {
buf[2]=readR(); buf[3]=readR();
res+=ntos((((buf[0]<<2)&0xff)|buf[1]>>4));
if (buf[2]!=-1) { res+=ntos((((buf[1]<<4)&0xff)|buf[2]>>2));
if (buf[3]!=-1) res+=ntos((((buf[2]<<6)&0xff)|buf[3]));
else done=true;
} else done=true;
} return res;
}
}
Base64.Alph=[
'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','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','0','1','2','3','4','5','6','7','8','9','+','/'];
Base64.AlphR=[];
| template |