web-dev-qa-db-fra.com

Comment programmer hex2bin en Javascript?

J'ai besoin de communiquer entre Javascript et PHP (j'utilise jquery pour ajax) mais la sortie du script PHP peut contenir des données binaires. C'est pourquoi j'utilise la fonction bin2hex en PHP. Ensuite, json_encode est appliqué sur le côté PHP. Ce que je ne sais pas, c'est comment convertir une chaîne hexadécimale en données binaires du côté Javascript.

Merci!

22
Martin Vseticka

JavaScript ne prend pas en charge les données binaires. Néanmoins, vous pouvez imiter cela avec des chaînes régulières.

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
14
Andris

Pour répondre à ta question:

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

Voici quelques fonctions supplémentaires qui pourraient vous être utiles pour travailler avec des données binaires:

//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)}
56
tobspr
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);    
}

merci à Andris !


D'autres informations utiles sur ce sujet (dex2bin, bin2dec) peuvent être trouvées ici . D'après cela, voici une solution bin2hex:

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

Bien que ce ne soit pas une réponse à la question, il est peut-être utile dans ce cas de savoir également comment inverser le processus:

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

}

Par exemple, utiliser hex2bin sur b637eb9146e84cb79f6d981ac9463de1 renvoie ¶7ëFèL·mÉF=á, puis le transmettre à bin2hex renvoie b637eb9146e84cb79f6d981ac9463de1.

Il pourrait également être utile de prototyper ces fonctions avec l’objet 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())
5
MichaelRushton

Toutes les solutions proposées utilisent String.fromCharCode, pourquoi ne pas simplement utiliser 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);
}

et alors:

alert( "68656c6c6f".hex2bin() ); //shows "hello"
3
Marco Demaio

En référence à node.js (pas dans le navigateur).

En gros, tout est trop élaboré et ne fonctionne pas bien.

les réponses ne sont pas alignées et, même si elles sont textuelles, elles sont un peu toutes les mêmes:

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 manière appropriée d'implémenter ceci dans le noeud est: 

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..

J'espère que cela t'aides.

2
davidsaliba

Si quelqu'un a besoin de l'autre direction (bin to hex), la voici:

function bin2hex(bin) {
    return new Buffer(bin).toString("hex");
}
0
Jan Bauer