2008-11-29 11 views
44

मैं जावास्क्रिप्ट में किसी ऑब्जेक्ट में बाइनरी डेटा इंजेक्ट करना चाहता हूं। क्या इसे करने का कोई तरीका है?जावास्क्रिप्ट में बाइनरी डेटा पढ़ने का कोई तरीका है?

अर्थात

var binObj = new BinaryObject('101010100101011'); 

उस प्रभाव के लिए कुछ। कोई भी मदद बहुत अच्छी रहेगी।

उत्तर

30

आप parseInt उपयोग कर सकते हैं:

var bin = parseInt('10101010', 2);

दूसरा तर्क (मूलांक) इनपुट का आधार है।

+26

मैं कहना है कि यह जवाब अब 2012 आप में पुरानी है मजबूर महसूस अब _Typed Arrays_ http://www.khronos.org/registry/typedarray/specs/latest/ पूर्व है = Uint8Array (नया ArrayBuffer (1000)); ' – lenkite

+0

@lenkite - क्या यह एक संभावित एक्सटेंशन है, या यह मौजूदा ब्राउज़र में कुछ उपलब्ध है (मान लें कि अधिकांश उपयोगकर्ता ब्राउज़र 2/3 वर्ष पुराने चिह्न पर हैं)? –

+2

@ डैनीस्टैपल - आज के ब्राउज़रों की एक उत्साहजनक संख्या में उपलब्ध है (बेशक) आईई: http://caniuse.com/#feat=typedarrays –

1

जावास्क्रिप्ट सरल स्ट्रिंग के अलावा किसी भी रूप में ऑब्जेक्ट को लोड करने के लिए एक तंत्र प्रदान नहीं करता है।

निकटतम आप ऑब्जेक्ट को एक स्ट्रिंग पर क्रमबद्ध कर रहे हैं, वैकल्पिक रूप से एन्क्रिप्ट/इसे संपीड़ित कर रहे हैं, इसे ब्राउज़र में भेज रहे हैं, और यदि आवश्यक हो तो डिक्रिप्टिंग/डिकंप्रेसिंग, सैनिटी, eval() और प्रार्थना() की जांच कर रहे हैं।

eval (जो काफी सुरक्षित नहीं है) का उपयोग करने के बजाय, आप अपने प्रारूप का उपयोग कर सकते हैं (वैकल्पिक रूप से, एक्सएमएल या जेसन जिसके लिए बहुत सारे libs हैं) और इसे स्वयं पार्स करें।

एक साइड नोट के रूप में, यदि ब्राउज़र को उपयोग करने योग्य डेटा (डिक्रिप्टिंग/डिकंप्रेसिंग के बाद) के बाद आप इसे रोकना चाहते हैं, तो इसे रोकने के लिए बहुत आसान है।

+10

प्रार्थना() फ़ंक्शन क्या है? –

10

जावास्क्रिप्ट कच्चे बाइनरी डेटा के लिए बहुत कम समर्थन है। आम तौर पर, इस प्रतिबंध के भीतर रहना सबसे अच्छा है। हालांकि, एक ऐसी चाल है जिसे मैं अपनी परियोजना की कोशिश करने पर विचार कर रहा हूं जिसमें ओलाप डेटाबेस में सेट ऑपरेशंस करने के लिए भारी बिटमैप्स में हेरफेर करना शामिल है। यह IE में काम नहीं करेगा।

मूल विचार यह है: बाइनरी डेटा को पीएनजी में जावास्क्रिप्ट पर भेजने के लिए मजबूर करें, उदाहरण के लिए, एक बिटमैप काला और सफेद पीएनजी हो सकता है, जिसमें काला 100% पारदर्शी हो सकता है। फिर बिटवाइज डेटा मैनिपुलेशन करने के लिए कैनवास ऑपरेशंस का उपयोग करें।

HTML5 Canvas में pixel array type शामिल है, जो किसी छवि में बाइट्स तक पहुंच की अनुमति देता है। कैनवास एक्सओआर जैसे कंपोजिटिंग ऑपरेशंस का भी समर्थन करता है। हल्का और अंधेरा करने में सक्षम होना चाहिए और OR। इन परिचालनों को उनके समर्थन में आने वाले किसी भी ब्राउज़र में अच्छी तरह से अनुकूलित किया जा सकता है - शायद GPU का उपयोग करना।

अगर कोई यह कोशिश करता है, तो कृपया मुझे बताएं कि यह कितना अच्छा काम करता है।

+3

जब आप HTML5 कैनवास का उपयोग कर रहे हैं, तो प्रसंस्करणजेएस लाइब्रेरी का उपयोग करने का प्रयास करें। उनके पास बहुत उपयोगी उपयोगिता कार्य हैं। –

23

यह binary ajax library है जो explained here है और another binary parser library भी है जो अधिक डेटा प्रकारों को संभाल सकता है।

आप Google गियर्स को भी देख सकते हैं जिसमें a binary Blob object है या फ्लैश के लिए जावास्क्रिप्ट रैपर बनाने पर एक नज़र डालें जो native ByteArray implementation प्रदान करता है।

या ... आप बैठते हैं और इंतज़ार करो और आशा है कि इन सब बातों बन कि standard :)

+0

इससे बहुत मदद मिली, धन्यवाद। – NiKo

+2

ये लिंक अब काम नहीं करते हैं ... मैं नई जेबीरी लाइब्रेरी की सिफारिश करता हूं: https://github.com/jDataView/jBinary – zippy

2

कि दूसरी तरह के आसपास ... pow और squareroot मठ-क्लास द्वारा गणना की जा सकती है हो सकता है सकते हैं .. मुझे नहीं पता कि यह सबसे तेज़ तरीका है, लेकिन यह "प्रोग्रामर व्यू" में विंडोज कैलक्यूलेटर जितना तेज़ है।

AlertFormatedBin(); 
function AlertFormatedBin() 
{ 
    var vals = decToBinArr(31,8); 
    var i; 

    var s = ""; 
    var mod = vals.length % 4; 
    for(i= 0; i <mod;i++) 
    { 
     s+=vals[i]; 
    } 
    if(i>0) 
     s+=" "; 
    var j = i; 
    for(i;i<vals.length;i++) 
    { 
     s+=vals[i]; 
     if(i-j != 0 && (i+1-j)%4 == 0) 
     { 
      s+=" "; 
     } 
    } 
    alert(s); 
} 

function decToBinArr(dec, minSize) 
{ 
    var mod = dec%2; 
    var r = new Array(); 
    if(dec > 1) 
    { 
     dec-=mod; 
     var bd = squareRootRoundedDown(dec); 
     if(minSize && minSize-1 > bd) 
      bd = minSize-1; 
     else 
      var i; 
      for(i = bd; i>0;i--) 
      { 
       var nxt = pow(2,i); 
       if(dec >= nxt) 
       { 
        r[i] = 1; 
        dec-=nxt; 
       } 
       else 
       { 
        r[i] = 0; 
       } 
      } 
    } 
    r[0]= mod; 
    r.reverse(); 
    return r; 
} 

function squareRootRoundedDown(dec) 
{ 
    if(dec<2) 
     return 0; 
    var x = 2; 
    var i; 
    for(i= 1;true;i++) 
    { 
     if(x>=dec) 
     { 
      i = x == dec ? i : i-1; 
      break; 
     } 
     x= x*2; 
    } 
    return i; 
} 

function pow(b,exp) 
{ 
    if(exp == 0) 
     return 0; 
    var i = 1; 
    var r= b; 
    for(i = 1; i < exp;i++) 
     r=r*b; 
    return r; 
} 
16

हाल सभी ब्राउज़रों पर आप कर सकते हैं:

xhr.overrideMimeType('text/plain; charset=x-user-defined'); 

और एक स्ट्रिंग को पुनः प्राप्त। द्विआधारी परिणाम प्राप्त करने के लिए आप आप एक ArrayBuffer

xhr.responseType = "arraybuffer"; 

परिणाम के रूप में मान प्राप्त कर सकता हर रात को फ़ायरफ़ॉक्स और क्रोम के बनाता है पर

data.charCodeAt(pos) & 0xff; 

करना होगा वहाँ तो पहुँचा जा सकता है

xhr.mozResponseArrayBuffer // Firefox 
xhr.response // Chrome 

फिर आप TypedArray (उदाहरण: Int32Array) यालागू कर सकते हैं परिणाम पढ़ने के लिए बफर पर।


आदेश में इस प्रक्रिया को आसान बनाने के लिए, मैं द्विआधारी प्रकार और एक DataView Wrapper ब्राउज़र के नवीनतम उपलब्ध पढ़ने की सुविधा का उपयोग करता है समर्थन करने के लिए एक jQuery Patch बनाया है।

+0

क्या आप शायद स्पिन के रूप में बाइनरी डेटा कैसे प्राप्त कर सकते हैं, यह स्पष्ट कर सकते हैं कि मेरा फ़ायरफ़ॉक्स हमेशा लाइन पर समाप्त होता है ' xhr.reponstype = "arraybuffer"; ' – Gobliins

+0

@ गोब्लिन: http://www.html5rocks.com/en/tutorials/file/xhr2/ – stuartdotnet

+0

क्या आप वाकई यह काम करते हैं? मेरी यूनिकोड भावना झुकाव है। यूनिकोड वर्ण कभी-कभी एक से अधिक बाइट लंबे होते हैं। – Hoffmann

1

प्रतिशत एन्कोडिंग किसी भी बाइनरी ब्लॉब के-> 1 प्रतिनिधित्व में अनस्केप तारों को अनदेखा कर सकता है और ब्राउज़र में भी पोर्टेबल है;

unescape("%uFFFF%uFFFF%uFFFF"); 

अधिकांश ब्राउज़र को दूषित करने का HTML पृष्ठों में shellcode एम्बेड करने के लिए this technique उपयोग करें, यह मनमाने ढंग से द्विआधारी धाराओं बनाने के लिए बहुत अच्छी तरह से काम करता है।

1

jBinary "यह भार बनाने के लिए,, पार्स, संशोधित करने और दोनों ब्राउज़र और Node.js. में जटिल बाइनरी फ़ाइलें और डेटा संरचनाओं को बचाने के आसान बना देता है"

मैं इसे इस्तेमाल नहीं किया है, लेकिन यह मैं जब पूछ ही प्रश्न यहाँ पूछा क्या पाया है ...

2

रूप @Zippy एक टिप्पणी में कहा, और हाल ही में (देर से 2016) समाधान में शामिल हैं:

  • DataView (स्टैंडर्ड)
  • jDataView (polyfill/DataView के विस्तार)
  • jBinary (jDataView पर बनाया गया)
`वर आगमन:
संबंधित मुद्दे