example - ¿Hay alguna manera de leer datos binarios en JavaScript?
bitwise traduccion (10)
Me gustaría inyectar datos binarios en un objeto en JavaScript. ¿Hay alguna forma de hacer esto?
es decir
var binObj = new BinaryObject(''101010100101011'');
Algo para ese efecto. Cualquier ayuda sería genial.
Como señaló @Zippy en un comentario, las soluciones más recientes (finales de 2016) incluyen:
- DataView (Estándar)
- jDataView (polyfill / extensión de DataView)
- github.com/jDataView/jBinary (basado en jDataView)
En todos los navegadores recientes, puede hacer:
xhr.overrideMimeType(''text/plain; charset=x-user-defined'');
Y recupera una cadena. Para obtener el resultado binario, tendrás que hacer
data.charCodeAt(pos) & 0xff;
En las compilaciones nocturnas de Firefox y Chrome puedes recuperar el valor como ArrayBuffer
xhr.responseType = "arraybuffer";
El resultado es luego accesible allí
xhr.mozResponseArrayBuffer // Firefox
xhr.response // Chrome
Luego puede aplicar un TypedArray (por ejemplo: Int32Array) o un DataView en el búfer para leer el resultado.
Para facilitar este proceso, hice un parche jQuery para admitir el tipo binario y un contenedor DataView que usa la última función de lectura disponible del navegador.
En un futuro cercano, podrás usar ArrayBuffers y standard .
Eso sería al revés ... pow
y squareroot
podrían ser calculados por la clase de matemáticas ... No sé si es la manera más rápida, pero es tan rápido como la calculadora de Windows en la "vista de programador" .
AlertFormatedBin();
function AlertFormatedBin()
{
var vals = decToBinArr(31,8);
var i;
var s = "";
var mod = vals.length % 4;
for(i= 0; i <mod;i++)
{
s+=vals[i];
}
if(i>0)
s+=" ";
var j = i;
for(i;i<vals.length;i++)
{
s+=vals[i];
if(i-j != 0 && (i+1-j)%4 == 0)
{
s+=" ";
}
}
alert(s);
}
function decToBinArr(dec, minSize)
{
var mod = dec%2;
var r = new Array();
if(dec > 1)
{
dec-=mod;
var bd = squareRootRoundedDown(dec);
if(minSize && minSize-1 > bd)
bd = minSize-1;
else
var i;
for(i = bd; i>0;i--)
{
var nxt = pow(2,i);
if(dec >= nxt)
{
r[i] = 1;
dec-=nxt;
}
else
{
r[i] = 0;
}
}
}
r[0]= mod;
r.reverse();
return r;
}
function squareRootRoundedDown(dec)
{
if(dec<2)
return 0;
var x = 2;
var i;
for(i= 1;true;i++)
{
if(x>=dec)
{
i = x == dec ? i : i-1;
break;
}
x= x*2;
}
return i;
}
function pow(b,exp)
{
if(exp == 0)
return 0;
var i = 1;
var r= b;
for(i = 1; i < exp;i++)
r=r*b;
return r;
}
Hay una biblioteca ajax binaria que se explica aquí y también hay otra biblioteca de analizador binario que puede manejar más tipos de datos.
También puede mirar Google Gears, que tiene un objeto BLOB binario o echar un vistazo a hacer un contenedor de JavaScript para Flash que proporciona una implementación nativa de ByteArray .
O ... puedes sentarte y esperar y esperar que todas estas cosas se vuelvan standard :)
JavaScript tiene muy poco soporte para datos binarios en bruto. En general, es mejor vivir dentro de esta restricción. Sin embargo, hay un truco que estoy considerando intentar para un proyecto mío que implica manipular mapas de bits enormes para hacer operaciones de conjunto en una base de datos OLAP. Esto no funcionará en IE .
La idea básica es la siguiente: coaccionar los datos binarios en un archivo PNG para enviarlos a JavaScript, por ejemplo, un mapa de bits podría ser un PNG en blanco y negro, y el negro es 100% transparente. Luego use las operaciones de Lienzo para hacer la manipulación de datos en modo bit.
HTML5 Canvas incluye un tipo de matriz de píxeles , que permite el acceso a bytes en una imagen. Canvas también admite operaciones de composición, como XOR. Aligerar y oscurecer debería ser capaz de hacer AND y OR. Es probable que estas operaciones estén bien optimizadas en cualquier navegador que las admita, probablemente utilizando la GPU.
Si alguien intenta esto, por favor dígame qué tan bien funciona.
Javascript no proporciona un mecanismo para cargar un objeto de ninguna forma que no sean cadenas simples.
Lo más cerca que puede hacer es serializar el objeto en una cadena, opcionalmente encriptarlo / comprimirlo, enviarlo al navegador y descifrarlo / descomprimirlo si es necesario, verificando la cordura, eval () y rezar ().
En lugar de usar eval (que no es seguro), puede usar su propio formato (alternativamente, xml o json para el que hay muchas librerías) y analizarlo usted mismo.
Como nota al margen, si desea que esto no se ofusque después de que el navegador obtiene los datos utilizables (después de descifrar / descomprimir), es demasiado fácil de eludir.
La codificación porcentual puede deshacer cadenas en una representación directa 1 <-> 1 de cualquier blob binario y también es portátil en todos los navegadores;
unescape("%uFFFF%uFFFF%uFFFF");
La mayoría de los exploits del navegador usan esta técnica para incrustar Shellcode en páginas HTML, funciona muy bien para crear flujos binarios arbitrarios.
Puedes usar parseInt:
var bin = parseInt(''10101010'', 2);
El segundo argumento (el radix) es la base de la entrada.
github.com/jDataView/jBinary "hace que sea más fácil crear, cargar, analizar, modificar y guardar archivos binarios complejos y estructuras de datos tanto en el navegador como en Node.js."
No lo he usado, pero es lo que encontré cuando hice la misma pregunta aquí ...