我需要在JavaScript和PHP之间进行通信(我使用jQuery进行AJAX),但是PHP脚本的输出可能包含二进制数据。因此,我在PHP端使用了bin2hex()和json_encode()。
如何使用JavaScript将十六进制字符串转换为二进制字符串?
如何使用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)}
Hex2Bin
和Bin2Hex
。在这两个函数得到错误结果后,我甚至没有尝试其他函数。你可以自己试试Hex2Bin
=> Bin2Hex
。 - GreenJavaScript不支持二进制数据。但是,您可以使用普通字符串来模拟。
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 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
函数会返回¶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())
关于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..
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"
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('');
}
String.prototype.hex2bin = function () {
if (this.length % 2 !== 0) return false;
let bytes = []
for (let i = 0; i < this.length - 1; i += 2) {
let charCode = parseInt(this.substring(i, i + 2), 16)
bytes.push(charCode)
}
return String.fromCharCode.apply(String, bytes)
.replace(/\x00+$/g, '') // not necessary
.trim()
}
console.log('78534F4C41527800000000000000000000000000'.hex2bin()) // xSOLARx (length: 7)
console.log('4D554C5449504153530000000000000000000000'.hex2bin()) // MULTIPASS (length: 9)
console.log('4C5A415200000000000000000000000000000000'.hex2bin()) // LZAR (length: 4)
function bin2hex(bin) {
return new Buffer(bin).toString("hex");
}