Il modo migliore per ottenere due bocconcini da un byte in javascript?
-
04-10-2019 - |
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.
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.
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