Как запрограммировать hex2bin в Javascript? - PullRequest
23 голосов
/ 08 октября 2011

Мне нужно общаться между Javascript и PHP (я использую jquery для ajax), но вывод PHP-скрипта может содержать двоичные данные. Вот почему я использую функцию bin2hex в PHP. Затем json_encode применяется на стороне PHP. Чего я не знаю, так это как преобразовать шестнадцатеричную строку в двоичные данные на стороне Javascript.

Спасибо!

Ответы [ 8 ]

58 голосов
/ 20 октября 2012

Чтобы ответить на ваш вопрос:

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

Вот некоторые дополнительные функции, которые могут оказаться полезными для работы с двоичными данными:

//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)}
15 голосов
/ 08 октября 2011

JavaScript не поддерживает двоичные данные. Тем не менее, вы можете эмулировать это с помощью обычных строк.

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
9 голосов
/ 28 марта 2012
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);    
}

благодаря Андрису !


Другая полезная информация по этой теме (dex2bin, bin2dec) может быть найдена здесь . В соответствии с этим, вот решение bin2hex:

parseInt(1100,2).toString(16); //--> c
5 голосов
/ 14 марта 2013

Хотя это и не ответ на реальный вопрос, в этом случае, возможно, полезно также знать, как изменить процесс на обратный:

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

}

Например, использование hex2bin в b637eb9146e84cb79f6d981ac9463de1 возвращает ¶7ëFèL·mÉF=á, а затем передача этого значения в bin2hex возвращает b637eb9146e84cb79f6d981ac9463de1.

Также может быть полезно создать прототип этих функций для объекта 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())
3 голосов
/ 14 июня 2013

Все предлагаемые решения используют String.fromCharCode, почему бы просто не использовать 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);
}

и затем:

alert( "68656c6c6f".hex2bin() ); //shows "hello"
2 голосов
/ 06 мая 2016

Со ссылкой на node.js (не в браузере).

По сути, это все перепроектировано и не работает.

ответы не выровнены, и хотя текстовые они одинаковы, все повсюду:

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

Правильный способ реализовать это в узле:

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

Надеюсь, это поможет.

0 голосов
/ 19 марта 2018

Если кому-то нужно другое направление (от бин до гекса), вот оно:

function bin2hex(bin) {
    return new Buffer(bin).toString("hex");
}
0 голосов
/ 13 января 2013

JavaScript действительно содержит поддержку двоичных данных. См. Например, https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/Uint8Array.

Чтобы преобразовать в гекс, прочитайте байт, а затем возьмите каждый из двух кусочков (группы по четыре бита) и конвертируйте их в гекс.

...