template

Index :: Javascript :: Module :: Bitstreams (binch.js)

Dieses Modul kapselt das Lesen und Schreiben von Bitgruppen (Länge 1 bis 32 Bit). Als Quelle bzw. Ziel dient ein String, dessen Bytesequenz als Container für Datenbits betrachtet wird.

Einsatzgebiete sind Konverter, die auf Bit-Ebene arbeiten, vornehmlich En-/Decoder oder Komprimierungstools.
Zur Darstellung bzw. Speicherung von Bitstreams wird häufig das Base64-Format verwendet.

Das Interface:

MethodenBeschreibung
Write() Bitgruppe schreiben.
Parameter:
  • n (Integer) Anzahl [1...32] der zu schreibenden Bits.
  • v (Integer) Wert, dessen Bits geschrieben werden sollen.
Read() Bitgruppe Lesen.
Parameter:
  • n (Integer) Anzahl [1...32] der zu lesenden Bits.
Liefert die Bitgruppe als Integer-Wert.
Data() Stream initialisieren bzw. auslesen.
Parameter:
  • [s] (String) optional: Stream, aus dem gelesen werden soll.
    Die Angabe eines Leerstrings löscht den internen Schreib-Stream.
Falls kein Parameter angegeben, wird der geschriebene Stream (String) geliefert.

Beispiel zur Verwendung der Klasse:
var binch = new Binch();

//---- Werte 10, 100 und 1000 schreiben
binch.Write(4, 10);
binch.Write(7, 100);
binch.Write(12, 1000);
//---- Erzeugten Stream holen
var mystream = binch.Data();
...
//---- Stream wieder auslesen binch.Data(mystream); // Stream festlegen a = binch.Read(4); // Wert 10 lesen b = binch.Read(7); // Wert 100 lesen c = binch.Read(12); // Wert 1000 lesen
...
//---- Weiteren Stream erzeugen binch.Data(''); // Reset binch.Write(1, 0); // etc.
...
Der Modul-Code:
Binch = function () {
  var Seq='', SeqL=0, SeqP=0, Bits=0, Akku=0, cons=this.constructor;
  function ntos(n) { n=n.toString(16); if (n.length==1) n='0'+n; return unescape('%'+n); }

  this.Write = function(n,v) {
    if (Bits) Akku|=(v<<Bits); else Akku=v; Bits+=n;
    while (Bits>7) { Seq+=ntos(Akku&255); SeqL++; Akku>>=8; Bits-=8; }
  }
  this.Read = function(n) {
    while (Bits<n) { if (SeqP<SeqL) Akku|=(Seq.charCodeAt(SeqP++)<<Bits); Bits+=8; }
    var v=Akku&cons.BitsMsk[n]; Akku>>=n; Bits-=n; return v;
  }
  this.Data = function(s) {
    if (s==undefined) { if (Bits) { Seq+=ntos(Akku); SeqL++; Bits=Akku=0; } return Seq; }
    Seq=s; SeqL=s.length; SeqP=Bits=Akku=0;
  }
}
Binch.BitsMsk=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,
262143,524287,1048575,2097151,4194303,8388607,16777215,33554431,67108863,134217727,268435455,
536870911,1073741823,2147483647,4294967295];

Index :: Javascript


template