Frage

Ich bin eine Binärdatei in Javascript Parsen, die zwei Informationen pro Byte speichert, eine pro knabbern. Die Werte sind natürlich, 0-16 und 0-16.

In allen anderen Teilen des Dateiformats stellt jedes Byte eine Information, so dass ich die folgenden, um erfolgreich die Zahlenwerte zu erhalten verwendet haben ich brauche:

var num = str.charCodeAt(0) & 0xFF;

Aber ich bin zu versuchen, stecken, um herauszufinden, wie man den 0-16-Wert des ersten knabbern zu bekommen, und das gleiche gilt für die zweite Nibble von meiner Single-Byte-Zeichen „str“.

Jede mögliche Hilfe schätzen zu diesem Thema.

War es hilfreich?

Lösung

var num = str.charCodeAt(0) & 0xFF;
var nibble1 = num & 0xF;
var nibble2 = num >> 4;

Andere Tipps

Sie können tun:

var num = str.charCodeAt(0);
var lower_nibble = (num & 0xF0) >> 4;
var higher_nibble = num & 0x0F;

Wie funktioniert es?

Hier können die Bit-Darstellung von num annehmen, ist abcdwxyz und wir wollen abcd höhere knabbern und wxyz als untere Nibble extrahieren.

Um das untere Nibble extrahieren wir maskieren nur die höhere Nibble durch bitweise die Zahl mit 0x0F Anding:

a b c d w x y z
              &
0 0 0 0 1 1 1 1
---------------
0 0 0 0 w x y z  = lower nibble.

Um die höheren knabbern extrahieren wir zuerst die untere Nibble Maske durch bitweise AND-Verknüpfung mit 0xF0 wie:

a b c d w x y z
              &
1 1 1 1 0 0 0 0
---------------
a b c d 0 0 0 0

und dann bitweise wir rechts- Verschiebung das Ergebnis rechts 4mal der nachgestellten Nullen loszuwerden.

Bitwise rechts eine Variable 1 Zeitverschiebung wird es machen verliert das Bit ganz rechts und macht das am weitesten links stehenden Bit Null:

a b c d w x y z 
           >> 1
----------------
0 a b c d w x y

In ähnlicher bitweise Recht 2 mal Verschiebung wird einführen Ergebnis in:

a b c d w x y z 
           >> 2
----------------
0 0 a b c d w x

und bitweise Verschiebung nach rechts 4 Mal gibt:

a b c d w x y z 
           >> 4
----------------
0 0 0 0 a b c d 

als eindeutig das Ergebnis ist der höhere Nibble des Bytes (abcd) zu sehen.

Da ich dies favoriting, wollte ich einige Dinge hinzufügen Ich schrieb nur, dass nützlich sein könnten. Vielleicht werden andere finden es sinnvoll, auch.

Unterhalb des jsFiddle

Prototypen:


   Number.prototype.fromCharCode  = function ()   {return String.fromCharCode(this);        };

   String.prototype.byte          = function (val){  var a = new Array();                                                         
                                                     for(var i=(val||0),n=val===0?0:this.length-1; i<=n; i++){
                                                        a.push(this.charCodeAt(i) & 0xFF);
                                                     }
                                                     return a;
                                                  };

   String.prototype.HiNibble      = function (val){
                                                     var b = this.byte(val);
                                                     var a = new Array();
                                                     for(var i=0,n=b.length-1; i<=n; i++){a.push(b[i] >> 4);}
                                                     return a;
                                                  };

   String.prototype.LoNibble      = function (val){
                                                     var b = this.byte(val);
                                                     var a = new Array();
                                                     for(var i=0,n=b.length-1; i<=n; i++){a.push(b[i] & 0xF);}
                                                     return a;
                                                  };


Beispiel Anrufe:


   var str   = new String("aB");
   console.log(str.byte());             // [ 97, 66 ]
   console.log(str.HiNibble());         // [ 6, 4 ]
   console.log(str.LoNibble());         // [ 1, 2 ]


   console.log(str.byte(0));            // [ 97 ]
   console.log(str.HiNibble(0));        // [ 6 ]
   console.log(str.LoNibble(0));        // [ 1 ]

   var bar = "c";
   console.log(bar.byte());             // [ 99 ]
   console.log(bar.HiNibble());         // [ 6 ]
   console.log(bar.LoNibble());         // [ 3 ]

   var foobar = (65).fromCharCode();    // from an integer (foobar=="A")
   console.log(foobar.byte());          // [ 65 ]
   console.log(foobar.HiNibble());      // [ 4 ]
   console.log(foobar.LoNibble());      // [ 1 ]


hinzugefügt Nur für mögliche Hilfe, aber wird nicht verwendet, in dem oben:


/* Useful function that I modified
   Originally from: http://www.navioo.com/javascript/dhtml/Ascii_to_Hex_and_Hex_to_Ascii_in_JavaScript_1158.html
*/
   function AscHex(x,alg){
      hex         = "0123456789ABCDEF";

      someAscii   = '  !"#$%&\''
                  + '()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\'
                  + ']^_`abcdefghijklmnopqrstuvwxyz{|}';
      r           = "";
      if(alg=="A2H"){
         for(var i=0,n=x.length;i<n;i++){
            let=x.charAt(i);
            pos=someAscii.indexOf(let)+32;
            h16=Math.floor(pos/16);
            h1=pos%16;
            r+=hex.charAt(h16)+hex.charAt(h1);
         }
      }
      if(alg=="H2A"){
         for(var i=0,n=x.length;i<n;i++){
            let1=x.charAt(2*i);
            let2=x.charAt(2*i+1);
            val=hex.indexOf(let1)*16+hex.indexOf(let2);
            r+=someAscii.charAt(val-32);
         }
      }
      return r;
   }

   console.log(AscHex('65','A2H'));                // A
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top