Mejor manera de conseguir dos mordiscos de un byte en javascript?
-
04-10-2019 - |
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.
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.
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