2011-10-08 8 views
19

Necesito comunicarme entre Javascript y PHP (uso jquery para ajax) pero el resultado del script PHP puede contener datos binarios. Es por eso que uso la función bin2hex en PHP. Luego se aplica json_encode en el lado de PHP. Lo que no sé es cómo convertir cadenas hexadecimales a datos binarios en el lado de Javascript.¿Cómo programar hex2bin en Javascript?

Gracias!

+2

@MartyIX: Aquí hay una [función Javascript licenciada por BSD] (http://freebeer.smithii.com/www/_source.php?file=%2Fhome%2Fross%2Fpublic_html%2Ffreebeer%2Fwww%2Flib%2Fbin2hex. js) que hace lo que quieres. –

+0

Andres Rifrio: ¡Gracias! –

Respuesta

13

JavaScript no tiene soporte para datos binarios. Sin embargo, puedes emular esto con cadenas regulares.

var hex = "375771", // ASCII HEX: 37="7", 57="W", 71="q" 
    bytes = [], 
    str; 

for(var i=0; i< hex.length-1; i+=2){ 
    bytes.push(parseInt(hex.substr(i, 2), 16)); 
} 

str = String.fromCharCode.apply(String, bytes); 

alert(str); // 7Wq 
8
function hex2bin(hex) 
{ 
    var bytes = [], str; 

    for(var i=0; i< hex.length-1; i+=2) 
     bytes.push(parseInt(hex.substr(i, 2), 16)); 

    return String.fromCharCode.apply(String, bytes);  
} 

gracias a Andris!


Otra información útil sobre este tema (dex2bin, BIN2DEC) se puede encontrar here. De acuerdo con esto, aquí es una solución bin2hex:

parseInt(1100,2).toString(16); //--> c 
46

Para responder a su pregunta:

function Hex2Bin(n){if(!checkHex(n))return 0;return parseInt(n,16).toString(2)} 

Estas son algunas funciones adicionales que pueden ser útiles para trabajar con datos binarios:

//Useful Functions 
function checkBin(n){return/^[01]{1,64}$/.test(n)} 
function checkDec(n){return/^[0-9]{1,64}$/.test(n)} 
function checkHex(n){return/^[0-9A-Fa-f]{1,64}$/.test(n)} 
function pad(s,z){s=""+s;return s.length<z?pad("0"+s,z):s} 
function unpad(s){s=""+s;return s.replace(/^0+/,'')} 

//Decimal operations 
function Dec2Bin(n){if(!checkDec(n)||n<0)return 0;return n.toString(2)} 
function Dec2Hex(n){if(!checkDec(n)||n<0)return 0;return n.toString(16)} 

//Binary Operations 
function Bin2Dec(n){if(!checkBin(n))return 0;return parseInt(n,2).toString(10)} 
function Bin2Hex(n){if(!checkBin(n))return 0;return parseInt(n,2).toString(16)} 

//Hexadecimal Operations 
function Hex2Bin(n){if(!checkHex(n))return 0;return parseInt(n,16).toString(2)} 
function Hex2Dec(n){if(!checkHex(n))return 0;return parseInt(n,16).toString(10)} 
+1

Esto no parece funcionar con datos binarios reales, sino con representaciones ASCII de datos binarios. – Michael

+1

Sus funciones son incorrectas. Al menos 'Hex2Bin' y' Bin2Hex'. Ni siquiera intenté otro después. Obtuve resultados erróneos con esos dos. Pruébese 'Hex2Bin' =>' Bin2Hex' – Green

+0

He estado usando este juego durante mucho tiempo. Y estoy comenzando a usar Hex2Bin y me di cuenta de eso ahora. Hex2Bin está roto. Creo que Bin2Hex también está equivocado. – huggie

3

Aunque no es una respuesta a la pregunta real, tal vez sea útil en este caso también saber cómo revertir el proceso:

function bin2hex (bin) 
{ 

    var i = 0, l = bin.length, chr, hex = '' 

    for (i; i < l; ++i) 
    { 

    chr = bin.charCodeAt(i).toString(16) 

    hex += chr.length < 2 ? '0' + chr : chr 

    } 

    return hex 

} 

A modo de ejemplo, el uso de hex2bin en b637eb9146e84cb79f6d981ac9463de1 vuelve ¶7ëFèL·mÉF=á, y luego pasando esto a bin2hex devuelve b637eb9146e84cb79f6d981ac9463de1.

También podría ser útil para crear prototipos de estas funciones al objeto String:

String.prototype.hex2bin = function() 
{ 

    var i = 0, l = this.length - 1, bytes = [] 

    for (i; i < l; i += 2) 
    { 
    bytes.push(parseInt(this.substr(i, 2), 16)) 
    } 

    return String.fromCharCode.apply(String, bytes) 

} 

String.prototype.bin2hex = function() 
{ 

    var i = 0, l = this.length, chr, hex = '' 

    for (i; i < l; ++i) 
    { 

    chr = this.charCodeAt(i).toString(16) 

    hex += chr.length < 2 ? '0' + chr : chr 

    } 

    return hex 

} 

alert('b637eb9146e84cb79f6d981ac9463de1'.hex2bin().bin2hex()) 
+0

bin2hex parece realmente ineficiente (y lento) si quiero, por ejemplo, convertir un archivo de imagen grande en una cadena hexadecimal ... – Michael

3

Todas las soluciones propuestas utilizan String.fromCharCode, ¿por qué no simplemente utilizando unescape?

String.prototype.hex2bin = function() 
{ 
    var i = 0, len = this.length, result = ""; 

    //Converting the hex string into an escaped string, so if the hex string is "a2b320", it will become "%a2%b3%20" 
    for(; i < len; i+=2) 
     result += '%' + this.substr(i, 2);  

    return unescape(result); 
} 

y luego:

alert("68656c6c6f".hex2bin()); //shows "hello" 
+0

* ¿por qué no simplemente usar unescape *? Simplemente porque está obsoleto. ;) – yckart

+0

puede usar decodeURIComponent en lugar de unescape y esto está perfectamente bien. Sin embargo, gracias @Marco, utilicé tu solución –

1

Con referencia a Node.js (no en el navegador).

Básicamente está completamente diseñado y no funciona bien.

respuestas están fuera de alineación y aunque el texto en cuanto que son los mismos bits sabia todo es por todo el lugar:

curl http://phpimpl.domain.com/testhex.php | xxd 

00000000: de56 a735 4739 c01d f2dc e14b ba30 8af0 .Q.%G9.....;.0.. 

curl http://nodejs.domain.com/ | xxd 

00000000: c39e 56c2 a725 4739 c380 c3ad c3b1 c39c ..Q..%G9........ 
00000010: c3a1 37c2 6b30 c28f c3b0     ..;..0.... 

La forma correcta de implementar esto en el nodo es:

function hex2bin(hex){ 
    return new Buffer(hex,"hex"); 
} 


curl http://nodejs.domain.com/ | xxd 

00000000: de56 a735 4739 c01d f2dc e14b ba30 8af0 .Q.%G9.....;.0.. 

Espero que esto ayude.

Cuestiones relacionadas