2008-11-29 6 views

Antwort

30

können Sie parseInt verwenden:

var bin = parseInt('10101010', 2);

Das zweite Argument (das radix) ist die Basis des Eingangs.

+26

Ich glaube gezwungen, darauf zu hinweisen, dass diese Antwort jetzt im Jahr 2012. Sie haben veraltet ist jetzt _Typed Arrays_ http://www.khronos.org/registry/typedarray/specs/latest/ Ex: 'var arr = Uint8Array (new ArrayBuffer (1000)); ' – lenkite

+0

@lenkite - ist das eine mögliche Erweiterung, oder ist es etwas, das in den meisten aktuellen Browsern verfügbar ist (die meisten Browser sind auf die 2/3 Jahre alte Marke gesetzt)? –

+2

@DannyStaple - verfügbar in einer ermutigenden Anzahl von heutigen Browsern, abgesehen von (natürlich) IE: http://caniuse.com/#feat=typedarrays –

1

Javascript bietet keinen Mechanismus zum Laden eines Objekts in einer anderen Form als einfache Zeichenfolgen.

Am nächsten ist das Serialisieren des Objekts in eine Zeichenfolge, optional das Verschlüsseln/Komprimieren, das Senden an den Browser und das Entschlüsseln/Dekomprimieren, falls erforderlich, Überprüfung auf Vernunft, eval() und pray().

Anstatt eval zu verwenden (was nicht ganz sicher ist), können Sie Ihr eigenes Format (alternativ, xml oder json, für das es viele libs gibt) verwenden und es selbst analysieren.

Als eine Randnotiz, wenn Sie dies für die Verschleierung wünschen, nachdem der Browser die verwendbaren Daten (nach Entschlüsselung/Dekomprimierung) erhält, ist es zu leicht zu umgehen.

+10

Was ist die pray() Funktion? –

10

JavaScript unterstützt sehr wenig rohe Binärdaten. Im Allgemeinen ist es das Beste, innerhalb dieser Einschränkung zu leben. Es gibt jedoch einen Trick, den ich für ein Projekt von mir in Betracht ziehe, bei dem riesige Bitmaps manipuliert werden müssen, um Operationen in einer OLAP-Datenbank zu setzen. Dies funktioniert nicht in IE.

Die Grundidee ist dies: Erzwinge die Binärdaten in ein PNG, um es an JavaScript zu senden. Zum Beispiel könnte eine Bitmap ein Schwarz-Weiß-PNG sein, wobei Schwarz 100% transparent ist. Verwenden Sie Canvas-Operationen, um eine bitweise Datenbearbeitung durchzuführen.

Die HTML5 Canvas enthält eine pixel array type, die Zugriff auf Bytes in einem Bild ermöglicht. Canvas unterstützt auch Compositing-Vorgänge wie XOR. Aufhellen und Abdunkeln sollte UND und ODER machen können. Diese Operationen werden wahrscheinlich in jedem Browser, der sie unterstützt, gut optimiert sein - wahrscheinlich unter Verwendung der GPU.

Wenn jemand dies versucht, lassen Sie mich bitte wissen, wie gut es funktioniert.

+3

Wenn Sie den HTML5-Zeichenbereich verwenden, verwenden Sie die Bibliothek processingJS. Sie haben viele nützliche Nutzenfunktionen. –

23

Es gibt binary ajax library das ist explained here und es gibt auch another binary parser library, die mehr Datentypen verarbeiten kann.

Sie könnten auch auf Google Gears, die a binary Blob object hat oder schauen Sie sich einen Javascript Wrapper für Flash, die eine bietet.

Oder ... können Sie sitzen und warten und hoffen, dass all diese Dinge standard :)

+0

Das hat sehr geholfen, danke. – NiKo

+2

Diese Links funktionieren nicht mehr ... Ich würde die neuere jBinary-Bibliothek empfehlen: https://github.com/jDataView/jBinary – zippy

2

geworden, dass umgekehrt sein würde ... pow und squareroot könnte von der Math-Klasse berechnet werden .. Ich weiß nicht ob es der schnellste Weg ist, aber es ist so schnell wie der Windows Rechner in der "Programmer View".

AlertFormatedBin(); 
function AlertFormatedBin() 
{ 
    var vals = decToBinArr(31,8); 
    var i; 

    var s = ""; 
    var mod = vals.length % 4; 
    for(i= 0; i <mod;i++) 
    { 
     s+=vals[i]; 
    } 
    if(i>0) 
     s+=" "; 
    var j = i; 
    for(i;i<vals.length;i++) 
    { 
     s+=vals[i]; 
     if(i-j != 0 && (i+1-j)%4 == 0) 
     { 
      s+=" "; 
     } 
    } 
    alert(s); 
} 

function decToBinArr(dec, minSize) 
{ 
    var mod = dec%2; 
    var r = new Array(); 
    if(dec > 1) 
    { 
     dec-=mod; 
     var bd = squareRootRoundedDown(dec); 
     if(minSize && minSize-1 > bd) 
      bd = minSize-1; 
     else 
      var i; 
      for(i = bd; i>0;i--) 
      { 
       var nxt = pow(2,i); 
       if(dec >= nxt) 
       { 
        r[i] = 1; 
        dec-=nxt; 
       } 
       else 
       { 
        r[i] = 0; 
       } 
      } 
    } 
    r[0]= mod; 
    r.reverse(); 
    return r; 
} 

function squareRootRoundedDown(dec) 
{ 
    if(dec<2) 
     return 0; 
    var x = 2; 
    var i; 
    for(i= 1;true;i++) 
    { 
     if(x>=dec) 
     { 
      i = x == dec ? i : i-1; 
      break; 
     } 
     x= x*2; 
    } 
    return i; 
} 

function pow(b,exp) 
{ 
    if(exp == 0) 
     return 0; 
    var i = 1; 
    var r= b; 
    for(i = 1; i < exp;i++) 
     r=r*b; 
    return r; 
} 
16

Auf allen neueren Browsern können Sie tun:

xhr.overrideMimeType('text/plain; charset=x-user-defined'); 

Und eine Zeichenfolge abrufen. Um das binäre Ergebnis zu erhalten Sie

data.charCodeAt(pos) & 0xff; 

zu tun haben, auf die jede Nacht von Firefox und Chrome baut man den Wert als ArrayBuffer abrufen können

xhr.responseType = "arraybuffer"; 

Das Ergebnis ist dann zugänglich dort

Dann können Sie eine TypedArray (zB: Int32Array) oder eineanwendenauf dem Puffer, um das Ergebnis zu lesen.


Um diesen Prozess zu erleichtern, machte ich ein jQuery Patch den binären Typen und ein DataView Wrapper zu unterstützen, die neueste verfügbare Lese Funktion des Browsers verwendet.

+0

können Sie vielleicht klären, wie Sie die Binärdaten als String erhalten, mein Firefox endet immer an der Zeile ' xhr.reponstype = "Array-Puffer"; " – Gobliins

+0

@Gobliins: http://www.html5rocks.com/en/tutorials/file/xhr2/ – stuartdotnet

+0

Sind Sie sicher, dass das funktioniert? Mein Unicode-Sinn kribbelt. Unicode-Zeichen sind manchmal mehr als ein Byte lang. – Hoffmann

1

Die prozentuale Kodierung kann Zeichenketten in eine direkte 1 < -> 1 Repräsentation eines beliebigen binären Blobs einfügen und ist auch über Browser hinweg portierbar;

unescape("%uFFFF%uFFFF%uFFFF"); 

Die meisten Browser this technique zum Einbetten von Shellcode in HTML-Seiten verwenden ausnutzen, es funktioniert sehr gut für beliebigen Binärströme zu schaffen.

1

jBinary „macht es einfach zu erstellen, zu laden, analysieren, ändern und komplexe Binär-Dateien und Datenstrukturen in beiden Browsern und Node.js. speichern“

Ich habe es nicht benutzt, aber es ist, was ich gefunden, wenn die gleiche Frage hier gefragt fragen ...

2

Wie @Zippy in einem Kommentar darauf hingewiesen, die neuere (Ende 2016) Lösungen gehören: