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. Puis json_encode est appliqué du côté de 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!

21
demandé sur Martin Vseticka 2011-10-08 11:38:20

8 réponses

JavaScript ne supporte pas les données binaires. Néanmoins, vous pouvez l'imiter avec des cordes 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
répondu Andris 2011-10-08 07:53:01

pour répondre à votre question:

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

Voici d'autres fonctions que vous pouvez trouver 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)}
50
répondu tobspr 2015-06-18 11:36:20
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 . Selon cela, Voici une bin2hex solution:

parseInt(1100,2).toString(16); //--> c
9
répondu Community 2017-05-23 12:18:20

bien qu'il ne s'agisse pas d'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

}

à titre d'exemple, en utilisant hex2bin sur b637eb9146e84cb79f6d981ac9463de1 retourne ¶7ëFèL·mÉF=á , puis en le passant à bin2hex retourne b637eb9146e84cb79f6d981ac9463de1 .

il pourrait également être utile de prototype ces fonctions à la String objet:

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
répondu MichaelRushton 2013-03-14 09:59:57

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 ensuite:

alert( "68656c6c6f".hex2bin() ); //shows "hello"
3
répondu Marco Demaio 2013-06-14 17:58:50

en référence au noeud.js ( pas dans le navigateur ).

en gros, c'est trop technique et ça ne marche pas bien.

les réponses sont hors de l'alignement et bien que textuel ils sont le même bit sage tout est partout:

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 bonne façon 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..

Espérons que cette aide.

2
répondu davidsaliba 2016-05-06 16:12:24

JavaScript contient effectivement le soutien pour les données binaires. Voir https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/Uint8Array par exemple.

pour convertir en hex, lire un octet puis prendre chacun des deux grignotines (groupes de quatre bits) et les convertir en hex.

0
répondu eb80 2013-01-13 00:31:49

si quelqu'un a besoin de l'autre direction (bin à hex), voici:

function bin2hex(bin) {
    return new Buffer(bin).toString("hex");
}
0
répondu Jan Bauer 2018-03-19 11:20:34