दिलचस्प पोस्ट
Google भाषण मान्यता समयबाह्य क्यों System.gc () कॉल करने के लिए खराब अभ्यास है? सूची की समझ कैसे काम करता है की व्याख्या? ओपनसीवी में सरणी / वेक्टर को चटाई करना कन्वर्ट कैसे जावा में एक सामान्य सरणी बनाने के लिए? ggplot2: घनत्व वक्र के साथ ओवरले हिस्टोग्राम आप फेसबुक पेज पर दीवार पर कैसे पोस्ट करते हैं (प्रोफ़ाइल नहीं) हर दिन दोपहर एक सेवा को कैसे चलाने के लिए, और हर बूट पर अपाचे के साथ वेबसाइट छवि कैशिंग फ़ायरबेज का उपयोग कर सर्वर साइड गणना मैं स्टैकट्र्रेस या प्रतिबिंब का उपयोग करके किसी विधि का कॉलर कैसे प्राप्त करूं? स्पार्क में पंक्तियां सपाट पायथन रिगेक्स मिलान वाले यूनिकोड गुण स्काला का "पोस्टफिक्स ऑप्स" बड़े हिप को सही करने के क्या फायदे हैं?

एचटीएमएलएफ़ फ़ाइल एपीआई पाठ और बाइनरी के रूप में पढ़ा जाता है

मैं वर्तमान में HTML5 फ़ाइल एपीआई पर काम कर रहा हूं, और मुझे बाइनरी फ़ाइल डेटा प्राप्त करने की आवश्यकता है। The FileReader का readAsText , और readAsDataURL विधियां ठीक काम करती हैं, लेकिन readAsBinaryString समान डेटा को readAsText रूप में readAsText

मुझे द्विआधारी डेटा की आवश्यकता है, लेकिन एक पाठ स्ट्रिंग प्राप्त करने के लिए I क्या मैं कुछ भूल रहा हूँ?

वेब के समाधान से एकत्रित समाधान "एचटीएमएलएफ़ फ़ाइल एपीआई पाठ और बाइनरी के रूप में पढ़ा जाता है"

readAsBinaryString कहता है कि डेटा को बाइनरी स्ट्रिंग के रूप में प्रस्तुत किया जाना चाहिए, जहां:

… प्रत्येक बाइट की श्रेणी में एक पूर्णांक द्वारा दर्शाया गया है [0. 255]।

जावास्क्रिप्ट मूल रूप से "द्विआधारी" प्रकार नहीं था (जब तक ईसीएमएस्क्रिप्ट 5 के टाइपिंग ऐरे * के विवरण के लिए वेबजीएल समर्थन (नीचे विवरण) – इसे ECMAScript 2015 के अर्रेबफर द्वारा स्थानांतरित कर दिया गया है) और इसलिए वे एक स्ट्रिंग के साथ गारंटी के साथ गए कि कोई भी वर्ण संग्रहीत नहीं है स्ट्रिंग में रेंज 0 से बाहर होनी चाहिए। (वे बजाय नंबरों की एक सरणी के साथ जा सकते थे, लेकिन वे नहीं थे; शायद बड़ी स्ट्रिंग संख्याओं के बड़े सरणियों की तुलना में अधिक मेमोरी-कुशल होती है, क्योंकि संख्याएं चलती हैं।)

यदि आप एक ऐसी फाइल पढ़ रहे हैं जो पश्चिमी लिपि में ज्यादातर टेक्स्ट है (ज्यादातर अंग्रेज़ी, उदाहरण के लिए), तो वह स्ट्रिंग बहुत पाठ की तरह दिखती है यदि आप उसमें यूनिकोड वर्णों के साथ एक फाइल पढ़ते हैं, तो आपको अंतर दिखाई दे, क्योंकि जावास्क्रिप्ट स्ट्रिंग्स यूटीएफ -16 ** (विवरण नीचे) हैं और कुछ अक्षर में 255 से ऊपर का मान होगा, जबकि फ़ाइल के अनुसार एक "बाइनरी स्ट्रिंग" एपीआई स्पेक में 255 से ऊपर कोई मान नहीं होता है (आपके पास यूनिकोड कोड बिंदु के दो बाइट्स के लिए दो व्यक्तिगत "वर्ण" होते हैं)।

यदि आप एक ऐसी फाइल पढ़ रहे हैं जो बिल्कुल पाठ नहीं है (एक छवि, संभवतः), तो आप शायद पढ़ने के पाठ के बीच एक बहुत ही समान परिणाम प्राप्त करेंगे और readAsBinaryString , लेकिन readAsBinaryString साथ आप जानते हैं कि readAsBinaryString करने का कोई प्रयास नहीं किया जाएगा पात्रों के रूप में बाइट अनुक्रम आप नहीं जानते हैं कि यदि आप readAsText उपयोग readAsText , क्योंकि readAsText एन्कोडिंग निर्धारण का उपयोग करने के लिए फाइल एन्कोडिंग क्या है यह जानने की कोशिश करेगी और फिर उसे जावास्क्रिप्ट के यूटीएफ -16 स्ट्रिंग्स पर मैप करें।

यदि आप एक फाइल बनाते हैं और इसे एएससीआईआई या यूटीएफ -8 के अलावा किसी अन्य चीज़ में संग्रहीत करते हैं, तो आप प्रभाव देख सकते हैं। (विंडोज में आप इसे नोटपैड के जरिए कर सकते हैं; "एडिडाइन" के रूप में "एन्कोडिंग" के रूप में "यूनिकोड" के साथ ड्रॉप-डाउन के रूप में, जिसके द्वारा वे यूटीएफ -16 का अर्थ समझते हैं, मुझे यकीन है मैक ओएस और * नििक्स एडिटर्स के पास एक समान सुविधा है।) यहां एक ऐसा पृष्ठ है, जो फ़ाइल को दोनों तरीकों से पढ़ने का नतीजा देता है:

 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-type" content="text/html;charset=UTF-8"> <title>Show File Data</title> <style type='text/css'> body { font-family: sans-serif; } </style> <script type='text/javascript'> function loadFile() { var input, file, fr; if (typeof window.FileReader !== 'function') { bodyAppend("p", "The file API isn't supported on this browser yet."); return; } input = document.getElementById('fileinput'); if (!input) { bodyAppend("p", "Um, couldn't find the fileinput element."); } else if (!input.files) { bodyAppend("p", "This browser doesn't seem to support the `files` property of file inputs."); } else if (!input.files[0]) { bodyAppend("p", "Please select a file before clicking 'Load'"); } else { file = input.files[0]; fr = new FileReader(); fr.onload = receivedText; fr.readAsText(file); } function receivedText() { showResult(fr, "Text"); fr = new FileReader(); fr.onload = receivedBinary; fr.readAsBinaryString(file); } function receivedBinary() { showResult(fr, "Binary"); } } function showResult(fr, label) { var markup, result, n, aByte, byteStr; markup = []; result = fr.result; for (n = 0; n < result.length; ++n) { aByte = result.charCodeAt(n); byteStr = aByte.toString(16); if (byteStr.length < 2) { byteStr = "0" + byteStr; } markup.push(byteStr); } bodyAppend("p", label + " (" + result.length + "):"); bodyAppend("pre", markup.join(" ")); } function bodyAppend(tagName, innerHTML) { var elm; elm = document.createElement(tagName); elm.innerHTML = innerHTML; document.body.appendChild(elm); } </script> </head> <body> <form action='#' onsubmit="return false;"> <input type='file' id='fileinput'> <input type='button' id='btnLoad' value='Load' onclick='loadFile();'> </form> </body> </html> 

अगर मैं इसे "परीक्षण 1 2 3" फाइल के साथ UTF-16 में संग्रहीत करता हूं, तो ये परिणाम मुझे मिलते हैं:

  पाठ (13):

 54 65 73 74 69 6 ई 67 20 31 20 32 20 33

 बाइनरी (28):

 एफएफ फ़े 54 00 65 00 73 00 74 00 69 00 6e 00 67 00 20 00 31 00 20 00 32 00 20 00 33 00 

जैसा कि आप देख सकते हैं, readAsText ने वर्णों की व्याख्या की है और इसलिए मुझे 13 ("1 2 3 का परीक्षण") की लंबाई मिल गई, और readAsBinaryString नहीं था, और इसलिए मुझे 28 (प्रत्येक बाइट के लिए दो-बाइट BOM प्लस दो बाइट मिली) ।


* XMLHttpRequest.response responseType = "arraybuffer" एचटीएमएल 5 में समर्थित है।

** "जावास्क्रिप्ट स्ट्रिंग यूटीएफ -16" एक अजीब बयान की तरह लग सकता है; क्या वे सिर्फ यूनिकोड नहीं हैं? नहीं, एक जावास्क्रिप्ट स्ट्रिंग UTF-16 कोड इकाइयों की एक श्रृंखला है ; आप किराए के जोड़े को दो अलग-अलग जावास्क्रिप्ट "वर्णों" के रूप में देखते हैं, हालांकि, वास्तव में, एक पूरे के रूप में किराए की जोड़ी सिर्फ एक ही चरित्र है विवरण के लिए लिंक देखें

मुझे लगता है कि आप बायनरी डेटा प्राप्त करने के लिए readAsArrayBuffer () का उपयोग कर सकते हैं।