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!
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
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)}
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
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())
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"
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.
Si quelqu'un a besoin de l'autre direction (bin to hex), la voici:
function bin2hex(bin) {
return new Buffer(bin).toString("hex");
}