Domanda

Sono l'analisi di un file binario in javascript che memorizza due informazioni per byte, uno per sgranocchiare. I valori sono, ovviamente, 0-16 e 0-16.

In tutte le altre parti del formato di file, ogni byte rappresenta un pezzo di informazione, così mi è stato utilizzando il seguente per ottenere con successo i valori numerici di cui ho bisogno:

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

Ma io sono bloccato a cercare di capire come ottenere il valore di 0-16 del primo morso, e lo stesso per il secondo morso dal mio carattere singolo byte "str".

Apprezzo tutto l'aiuto su questo.

È stato utile?

Soluzione

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

Altri suggerimenti

Si può fare:

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

Come funziona?

Consente di supporre la rappresentazione po 'di num è abcdwxyz e vogliamo estrarre abcd come superiore bocconcino e wxyz come inferiore nibble.

Per estrarre il nibble inferiore abbiamo appena mascherare il più alto dal bocconcino bit per bit AND il numero con 0x0F:

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.

Per estrarre il bocconcino più alto abbiamo prima maschera il nibble inferiore di bit per bit AND con 0xF0 come:

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

e poi abbiamo bit a bit spostamento a destra sotto il giusto risultato 4 volte per sbarazzarsi degli zeri finali.

Bitwise destra spostando un tempo variabile 1 renderà perdere il bit più a destra e rende la partita più bit di zero:

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

Allo stesso modo destra bit a bit spostando volte 2 risultato in introdurrà:

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

e destra bit a bit tempi di cambiata 4 dà:

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

come vede chiaramente il risultato è maggiore nibble del byte (abcd).

Dal momento che sto favoriting questo, ho voluto aggiungere alcune cose che ho appena scritto che potrebbe essere utile. Forse gli altri lo troveranno utile pure.

seguito di jsFiddle

Prototipi:


   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;
                                                  };


Esempio Chiamate:


   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 ]


Just aggiunto per l'aiuto possibile, ma non viene utilizzato in quanto sopra:


/* 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top