2011-10-08 18 views
19

मुझे जावास्क्रिप्ट और PHP के बीच संवाद करने की आवश्यकता है (मैं AJAX के लिए jquery का उपयोग करता हूं) लेकिन PHP स्क्रिप्ट के आउटपुट में बाइनरी डेटा हो सकता है। यही कारण है कि मैं PHP में फ़ंक्शन bin2hex का उपयोग करता हूं। फिर json_encode PHP पक्ष पर लागू होता है। मुझे नहीं पता कि हेक्साडेसिमल स्ट्रिंग को जावास्क्रिप्ट पक्ष पर बाइनरी डेटा में कैसे परिवर्तित किया जाए।जावास्क्रिप्ट में हेक्स 2bin प्रोग्राम कैसे करें?

धन्यवाद!

+2

@ मार्टिक्स: यहां एक [बीएसडी-लाइसेंस प्राप्त जावास्क्रिप्ट फ़ंक्शन] है (http://freebeer.smithii.com/www/_source.php?file=%2Fhome%2Fross%2Fpublic_html%2Ffreebeer%2Fwww%2Flib%2Fbin2hex। जेएस) जो आप चाहते हैं वह करता है। –

+0

एंड्रेस रिफ्रिओ: धन्यवाद! –

उत्तर

13

जावास्क्रिप्ट को बाइनरी डेटा के लिए समर्थन नहीं है। फिर भी आप इसे नियमित तारों के साथ अनुकरण कर सकते हैं।

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

Andris करने के लिए धन्यवाद!


इस विषय के बारे में अन्य उपयोगी जानकारी (dex2bin, BIN2DEC) here पाया जा सकता है।

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

आपके प्रश्न का उत्तर करने के लिए::

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)} 
कि के अनुसार, यहां एक bin2hex समाधान है
+1

यह वास्तविक बाइनरी डेटा के साथ काम नहीं कर रहा है, बल्कि बाइनरी डेटा के ASCII प्रस्तुतियों के साथ। – Michael

+1

आपके कार्य गलत हैं। कम से कम 'हेक्स 2 बिन' और 'बिन 2 हेक्स'। उन दोनों के साथ गलत परिणाम मिलने के बाद भी मैंने कोशिश नहीं की। अपने आप को 'हेक्स 2 बिन' => 'Bin2Hex' – Green

+0

आज़माएं मैं इस सेट का उपयोग लंबे समय से कर रहा हूं। और मैं हेक्स 2 बिन का उपयोग शुरू कर रहा हूं और अभी इसे महसूस किया। Hex2Bin टूट गया है। मुझे लगता है कि Bin2Hex भी गलत है। – huggie

0

जावास्क्रिप्ट में वास्तव में बाइनरी डेटा के लिए समर्थन शामिल है। उदाहरण के लिए https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays/Uint8Array देखें।

हेक्स में परिवर्तित करने के लिए, एक बाइट पढ़ें और फिर दो निबल्स (चार बिट्स के समूह) में से प्रत्येक को ले जाएं और उन्हें हेक्स में परिवर्तित करें।

3

हालांकि वास्तविक सवाल का एक जवाब नहीं है, यह इस मामले में शायद उपयोगी है भी प्रक्रिया को उल्टा करने के लिए कैसे पता करने के लिए:

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()) 
+0

bin2hex वास्तव में अक्षम (और धीमा) लगता है अगर मैं एक बड़ी छवि फ़ाइल को हेक्स स्ट्रिंग में परिवर्तित करना चाहता हूं ... – Michael

3

सभी प्रस्तावित समाधान 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" 
+0

* क्यों न केवल अनदेखा * का उपयोग करना - बस क्योंकि यह बहिष्कृत है। ;) – yckart

+0

आप अनदेखा के बजाय decodeURIComponent का उपयोग कर सकते हैं और यह बिल्कुल ठीक है। हालांकि धन्यवाद @ मार्को, मैंने आपके समाधान का उपयोग किया –

1

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.. 
पाठ के लिहाज से वे कर रहे हैं एक ही सा बुद्धिमान सब कुछ हर जगह है

प्रतिक्रियाओं संरेखण से बाहर है और यद्यपि हैं

उम्मीद है कि यह मदद करता है।

संबंधित मुद्दे