2008-11-29 27 views

Respuesta

30

Puede usar parseInt:

var bin = parseInt('10101010', 2);

El segundo argumento (la raíz) es la base de la entrada.

+26

me siento obligado a señalar que esta respuesta se ha quedado desfasado en 2012. Ahora tiene _Typed Arrays_ http://www.khronos.org/registry/typedarray/specs/latest/ Ex: 'arr var = Uint8Array (nuevo ArrayBuffer (1000)); ' – lenkite

+0

@lenkite - ¿Es una posible extensión, o es algo disponible en la mayoría de los navegadores actuales (considere que la mayoría de los navegadores de los usuarios tienen una marca de 2/3 años)? –

+2

@DannyStaple: disponible en un número alentador de navegadores de hoy, además de (por supuesto) IE: http://caniuse.com/#feat=typedarrays –

1

JavaScript no proporciona un mecanismo para cargar un objeto en 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 del todo 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 esto para la ofuscación después de que el navegador obtiene los datos utilizables (después de descifrar/descomprimir), es demasiado fácil de eludir.

+10

¿cuál es la función orar()? –

10

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 PNG para enviarlos a JavaScript, por ejemplo, un mapa de bits puede ser un PNG en blanco y negro, con el negro siendo 100% transparente. Luego use las operaciones de Lienzo para hacer la manipulación de datos en modo bit.

El HTML5 Canvas incluye un pixel array type, 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 lo intenta, dígame qué tan bien funciona.

+3

Cuando usa lienzo HTML5, intente usar la biblioteca de processingJS. Tienen muchas funciones de utilidad útiles. –

23

Hay binary ajax library que es explained here y también hay another binary parser library que pueden manejar más tipos de datos.

También puede mirar Google Gears que tiene a binary Blob object o echar un vistazo a hacer un contenedor de Javascript para Flash que proporciona un native ByteArray implementation.

O ... usted puede sentarse y esperar y esperar que todas estas cosas se vuelven standard :)

+0

Eso ayudó mucho, gracias. – NiKo

+2

Estos enlaces ya no funcionan ... Recomendaría una biblioteca jBinary más nueva: https://github.com/jDataView/jBinary – zippy

2

Eso sería al revés ... squarerootpow y puede ser calculado por el Math-Clase .. . No sé si es la manera más rápida, pero es tan rápido como la Calculadora de Windows en la "Vista del 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; 
} 
16

en todos los navegadores recientes que puede hacer:

xhr.overrideMimeType('text/plain; charset=x-user-defined'); 

y recuperar una cadena. Para obtener el resultado binario que tendrá que hacer

data.charCodeAt(pos) & 0xff; 

En la noche construye de Firefox y Chrome puede recuperar el valor como un ArrayBuffer

xhr.responseType = "arraybuffer"; 

El resultado no es entonces accesible

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.


Con el fin de facilitar este proceso, he hecho un jQuery Patch para apoyar el tipo binario y un DataView Wrapper que utiliza la última función de lectura disponible del navegador.

+0

¿Puede aclarar cómo obtener los datos binarios como una cadena, mi firefox siempre termina en la línea ' xhr.reponstype = "arraybuffer"; ' – Gobliins

+0

@Gobliins: http://www.html5rocks.com/en/tutorials/file/xhr2/ – stuartdotnet

+0

¿Estás seguro de que esto funciona? Mi sentido unicode es hormigueo. Los caracteres Unicode a veces tienen más de un byte de longitud. – Hoffmann

1

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"); 

mayoría navegador explotar a usar this technique para incrustar código shell en páginas HTML, que funciona muy bien para la creación de flujos binarios arbitrarios.

1

jBinary "hace que sea fácil de crear, cargar, analizar, modificar y guardar archivos binarios complejos y estructuras de datos tanto en navegador y Node.js."

no he usado, pero es lo que he encontrado cuando se le pide la misma pregunta que hizo aquí ...

2

Como @Zippy señaló en un comentario, las más reciente (finales de 2016) soluciones incluyen:

Cuestiones relacionadas