convert - javascript hex to decimal
¿Cómo programar hex2bin en Javascript? (8)
Necesito comunicarme entre Javascript y PHP (uso jquery para ajax) pero la salida del script PHP puede contener datos binarios. Es por eso que uso la función bin2hex
en PHP. Entonces json_encode
se aplica en el lado de PHP. Lo que no sé es cómo convertir una cadena hexadecimal a datos binarios en el lado de Javascript.
¡Gracias!
Aunque no es una respuesta a la pregunta real, quizás sea útil en este caso saber también 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
}
Como ejemplo, usar hex2bin
en b637eb9146e84cb79f6d981ac9463de1
devuelve ¶7ëFèL·mÉF=á
, y luego pasar esto a bin2hex
devuelve b637eb9146e84cb79f6d981ac9463de1
.
También podría ser útil para crear prototipos de estas funciones en el 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())
Con referencia a node.js (no en el navegador).
Básicamente, todo está sobre diseñado y no funciona bien.
las respuestas no están alineadas y, aunque con respecto al texto, son lo mismo, todo está por todas partes:
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.
JavaScript no tiene soporte para datos binarios. Sin embargo puedes emular esto con cuerdas 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
JavaScript realmente contiene soporte para datos binarios. Ver https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/Uint8Array por ejemplo.
Para convertir a hexadecimal, lea un byte y luego tome cada uno de los dos nibbles (grupos de cuatro bits) y conviértalos en hexadecimal.
Para responder tu pregunta:
function Hex2Bin(n){if(!checkHex(n))return 0;return parseInt(n,16).toString(2)}
Aquí hay 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)}
Si alguien necesita la otra dirección (bin a hex), aquí está:
function bin2hex(bin) {
return new Buffer(bin).toString("hex");
}
Todas las soluciones propuestas utilizan String.fromCharCode
, ¿por qué no usar simplemente 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 entonces:
alert( "68656c6c6f".hex2bin() ); //shows "hello"
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 . Según eso, aquí hay una solución bin2hex
:
parseInt(1100,2).toString(16); //--> c