簡體   English   中英

如何實現 hex2bin()?

[英]How do I implement hex2bin()?

我需要在 Javascript 和 PHP 之間進行通信(我將 jQuery 用於 AJAX),但 PHP 腳本的輸出可能包含二進制數據。 這就是我在 PHP 端使用bin2hex()json_encode()的原因。

如何使用 JavaScript 將十六進制字符串轉換為二進制字符串?

回答你的問題:

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

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

雖然不是實際問題的答案,但在這種情況下,了解如何反轉過程可能很有用:

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

}

作為一個例子,使用hex2binb637eb9146e84cb79f6d981ac9463de1返回¶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())

所有提議的解決方案都使用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"

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

希望這可以幫助。

這是 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;
}

而它的反面,

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

JavaScript 實際上包含對二進制數據的支持。 請參閱Uint8Array

只需從數組中讀取每個字節並將其轉換為十六進制。

如果有人需要另一個方向(二進制到十六進制),這里是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM