[英]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);
}
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
.作为一个例子,使用hex2bin
上b637eb9146e84cb79f6d981ac9463de1
返回¶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.