How to program hex2bin in Javascript?
我需要在JavaScript和PHP之间进行通信(我使用jQueryforAjax),但是PHP脚本的输出可能包含二进制数据。这就是为什么我在PHP中使用函数
谢谢!
要回答您的问题:
1 | function Hex2Bin(n){if(!checkHex(n))return 0;return parseInt(n,16).toString(2)} |
下面是一些您可能发现对处理二进制数据有用的进一步函数:
4javascript不支持二进制数据。不过,您可以使用常规字符串来模拟它。
1 2 3 4 5 6 7 8 9 10 11 | 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 |
1 2 3 4 5 6 7 8 9 | 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)可以在这里找到。据此,这里有一个
1 | parseInt(1100,2).toString(16); //--> c |
虽然不是对实际问题的回答,但在这种情况下,还应该知道如何反转过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 } |
例如,在
将这些函数原型化为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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()) |
所有建议的解决方案都使用
1 2 3 4 5 6 7 8 9 10 | 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); } |
然后:
1 | alert("68656c6c6f".hex2bin() ); //shows"hello" |
参考node.js(不在浏览器中)。
基本上,它都是经过精心设计的,不能很好地工作。
响应是不一致的,尽管文本方面的响应是相同的位方面的,但所有的内容都在这里:
1 2 3 4 5 6 7 8 | 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.... |
在节点中实现这一点的正确方法是:
1 2 3 4 5 6 7 8 | 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.. |
希望这有帮助。
如果有人需要另一个方向(从bin到hex),这里是:
1 2 3 | function bin2hex(bin) { return new Buffer(bin).toString("hex"); } |
javascript实际上包含对二进制数据的支持。例如,请参见https://developer.mozilla.org/en-us/docs/javascript/typed_array/uint8array。
要转换为十六进制,读取一个字节,然后取两个半字节(四位的一组)中的每一个,并将其转换为十六进制。