Question

Je traitement d'un fichier binaire en javascript qui stocke deux éléments d'information par octet, par une demi-octet. Les valeurs sont, bien sûr, 0-16 et 0-16.

Dans toutes les autres parties du format de fichier, chaque octet représente un élément d'information, donc je suis en utilisant ce qui suit pour obtenir avec succès les valeurs numériques dont j'ai besoin:

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

Mais je suis coincé à essayer de comprendre comment obtenir la valeur 0-16 de la première demi-octet, et même pour la 2ème demi-octet de mon caractère d'un seul octet « str ».

apprécierais toute aide à ce sujet.

Était-ce utile?

La solution

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

Autres conseils

Vous pouvez faire:

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

Comment ça fonctionne?

laisse supposer la représentation binaire de num est abcdwxyz et nous voulons extraire abcd comme plus grignotage et wxyz nibble bas.

Pour extraire le bas grignotage on masque juste le grignotage supérieur par le nombre Anding au niveau du bit avec 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.

Pour extraire le grignotage plus on premier masque le bas par grignotage Anding avec 0xF0 bitwise comme:

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

et nous droite au niveau du bit quart de travail le bon résultat 4 fois pour se débarrasser des zéros.

Bitwise décalage vers la droite une variable 1 fois, il sera perdre le peu plus à droite et rend le bit le plus à gauche zéro:

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

De même droit au niveau du bit de décalage temps 2 présentera les résultats suivants:

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

et bon changement au niveau du bit temps de 4 donne:

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

comme on le voit clairement le résultat est le plus élevé quartet de l'octet (abcd).

Depuis que je suis favoriting, je voulais ajouter quelques choses que je viens d'écrire cela pourrait être utile. Peut-être que d'autres trouveront utiles.

Ci-dessous de jsFiddle

Prototypes:


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


Exemple de code:


   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 ]


venez d'ajouter à l'aide possible, mais n'est pas utilisé dans ce qui précède:


/* 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top