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