Pregunta

Estoy analizar un archivo binario en javascript que está almacenando dos piezas de información por byte, uno por cada mordisco. Los valores son, por supuesto, 0-16 y 0-16.

En todas las demás partes del formato de archivo, cada byte representa una pieza de información, por lo que he estado utilizando el siguiente para conseguir con éxito los valores numéricos que necesito:

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

Pero estoy atascado en tratar de encontrar la manera de obtener el valor 0-16 del primer mordisco, y lo mismo para el segundo mordisco de mi sola "str" ??carácter de bytes.

agradecería cualquier ayuda en este sentido.

¿Fue útil?

Solución

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

Otros consejos

Puede hacer:

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

¿Cómo funciona?

Le permite supongamos que la representación de bits de num es abcdwxyz y queremos extraer abcd como una mayor mordisco y mordisco wxyz como inferior.

Para extraer el inferior sólo enmascaran el mayor mordisco por bit a bit AND de la serie 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.

Para extraer el nibble superior que primero enmascarar el nibble inferior por bit a bit AND con 0xF0 como:

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

y luego a nivel de bits de desplazamiento derecha el resultado correcto 4 veces para deshacerse de los ceros a la derecha.

derecha en modo bit cambiando un tiempo variable 1 hará que se suelte el bit más a la derecha y la izquierda hace que el bit más a cero:

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

Del mismo modo derecha en modo bit desplazamiento veces 2 introducirá resultado en:

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

y bit a bit tiempos de cambio 4 derecha da:

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

como se ve claramente el resultado es el mayor nibble del byte (abcd).

Desde que estoy favoriting esto, quería añadir algunas cosas que acabo de escribir que podría ser útil. Quizás otros lo encuentren útil también.

continuación de jsFiddle

Prototipos:


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


Ejemplo de llamadas:


   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 ]


Recién añadido para una posible ayuda, pero no se utiliza en los anteriores:


/* 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top