简体   繁体   English

如何实现 hex2bin()?

[英]How do I implement hex2bin()?

I need to communicate between Javascript and PHP (I use jQuery for AJAX), but the output of the PHP script may contain binary data.我需要在 Javascript 和 PHP 之间进行通信(我将 jQuery 用于 AJAX),但 PHP 脚本的输出可能包含二进制数据。 That's why I use bin2hex() and json_encode() on PHP side.这就是我在 PHP 端使用bin2hex()json_encode()的原因。

How do I convert the hexadecimal string in binary string, with JavaScript?如何使用 JavaScript 将十六进制字符串转换为二进制字符串?

To answer your question:回答你的问题:

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

Here are some further functions you may find useful for working with binary data:以下是一些您可能会发现对处理二进制数据有用的其他函数:

//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)}

JavaScript doesn't have support for binary data. JavaScript 不支持二进制数据。 Nevertheless you can emulate this with regular strings.不过,您可以使用常规字符串来模拟这一点。

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
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);    
}

thanks to Andris !谢安德里斯


Other useful information about this topic (dex2bin,bin2dec) can be found here .可以在此处找到有关此主题的其他有用信息 (dex2bin,bin2dec)。 According to that, here is a bin2hex solution:据此,这是一个bin2hex解决方案:

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

Although not an answer to the actual question, it is perhaps useful in this case to also know how to reverse the process:虽然不是实际问题的答案,但在这种情况下,了解如何反转过程可能很有用:

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

}

As an example, using hex2bin on b637eb9146e84cb79f6d981ac9463de1 returns ¶7ëFèL·mÉF=á , and then passing this to bin2hex returns b637eb9146e84cb79f6d981ac9463de1 .作为一个例子,使用hex2binb637eb9146e84cb79f6d981ac9463de1返回¶7ëFèL·mÉF=á ,然后使这对bin2hex返回b637eb9146e84cb79f6d981ac9463de1

It might also be useful to prototype these functions to the String object:将这些函数原型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())

All proposed solutions use String.fromCharCode , why not simply using unescape ?所有提议的解决方案都使用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);
}

and then:进而:

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

With reference to node.js ( not in browser ).参考 node.js (不在浏览器中)。

Basically it's all over-engineered and does not work well.基本上它都是过度设计的,不能很好地工作。

responses are out of alignment and though text-wise they are the same bit wise everything is all over the place :响应不对齐,尽管在文本方面它们是相同的,但一切都随处可见:

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

The proper way to implement this in node is :在节点中实现这一点的正确方法是:

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

Hope this helps.希望这可以帮助。

Here is an implementation of hex2bin in JS that takes a string and returns Uint8Array, works both in browsers and nodejs,这是 JS 中 hex2bin 的一个实现,它接受一个字符串并返回 Uint8Array,在浏览器和 nodejs 中都有效,

function hex2bin(hex) {
  var length = hex.length / 2;
  var result = new Uint8Array(length);
  for (var i = 0; i < length; ++i) {
    result[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
  }
  return result;
}

And its inverse,而它的反面,

function bin2hex(bin) {
  return Array.from(bin).map(function (x) {
    return x.toString(16).padStart(2, '0');
  }).join('');
}

JavaScript does actually contain support for binary data. JavaScript 实际上包含对二进制数据的支持。 See Uint8Array .请参阅Uint8Array

Just read each byte from the array and convert it into hexadecimal.只需从数组中读取每个字节并将其转换为十六进制。

If someone needs the other direction (bin to hex), here is it:如果有人需要另一个方向(二进制到十六进制),这里是:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM