template

Index :: Javascript :: Module :: Base64 En/Dekodierung (base64.js)

Dieses Modul kapselt das Lesen und Schreiben von Base64-Blöcken. Dabei werden auch optionale Header-, Footer- und Kommentarzeilen berücksichtigt. Siehe auch die Demo der Klasse.

Beispiel für einen kompletten Block mit Kommentar:
-----BEGIN demo block-----
info: blabla

SGFsbG8gV2VsdA==
-----END demo block-----
Das Interface:

EigenschaftenBeschreibung
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:
  • [c] (Integer) optional: Anzahl der zu schreibenden Base64-Spalten.
    Übergebene Werte werden auf eine der Zeilenlängen 64, 68, 72 oder 76 geclippt.
Liefert den aktuellen bzw. neuen Wert.
SetData() Definition der Base64- bzw. Originaldaten.
Parameter:
  • dat (String) Base64- bzw. Originaldaten.
  • [tit] (String) optional: Blocktitel, der geschrieben werden soll.
    Falls angegeben, werden beim Schreiben Kopf- und Fußzeilen hinzugefügt:
    -----BEGIN <Titel>-----
    ...
    -----END <Titel>-----
  • [rem] (String) optional: Kommentar, der geschrieben werden soll.
    Ein Kommentar kann mehrzeilig sein.
    Zwischen Kommentar und Base64-Code wird automatisch eine Leerzeile eingefügt.
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.

Der 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=[];

Index :: Javascript


template