Thursday 2 March 2017

Javascript Read File As Binary Optionen

ReadAsBinaryString sagt, dass die Daten als binärer String dargestellt werden müssen. Wo: jedes Byte wird durch eine Ganzzahl im Bereich 0..255 dargestellt. JavaScript hatte ursprünglich keinen binären Typ (bis ECMAScript 5s WebGL Unterstützung von Typed Array (Details unten) - es wurde durch ECMAScript 2015s ArrayBuffer ersetzt) ​​und so gingen sie mit einem String mit der Garantie, dass kein Zeichen in der String gespeichert wäre Außerhalb des Bereichs 0..255. (Sie könnten stattdessen mit einer Reihe von Zahlen gegangen sein, aber sie waren nicht vielleicht große Strings mehr Speicher-effizient als große Arrays von Zahlen, da Zahlen sind Gleitkomma.) Wenn Sie eine Datei lesen, die meistens Text in einem westlichen Skript ( Meist englisch, zum Beispiel), dann wird diese Saite wie ein Text aussehen. Wenn Sie eine Datei mit Unicode-Zeichen in ihr lesen, sollten Sie einen Unterschied bemerken, da JavaScript-Strings UTF-16 sind (Details unten) und so einige Charaktere Werte über 255 haben, wohingegen eine binäre Zeichenfolge nach der Datei-API-Spezifikation nicht haben würde Alle Werte über 255 (Sie haben zwei einzelne Zeichen für die beiden Bytes des Unicode-Code-Punktes). Wenn du eine Datei liest, die überhaupt keinen Text liest (ein Bild vielleicht), so bekommst du wohl noch ein sehr ähnliches Ergebnis zwischen readAsText und readAsBinaryString. Aber mit readAsBinaryString wissen Sie, dass es keinen Versuch gibt, Multi-Byte-Sequenzen als Zeichen zu interpretieren. Sie wissen das nicht, wenn Sie readAsText verwenden. Denn readAsText wird eine Codierungsbestimmung verwenden, um zu versuchen, herauszufinden, was die Dateikodierung ist und dann auf JavaScripts UTF-16 Strings abbilden. Sie können den Effekt sehen, wenn Sie eine Datei erstellen und sie in etwas anderes als ASCII oder UTF-8 speichern. (In Windows können Sie dies über Notepad die Save As als Codierung Drop-Down mit Unicode auf sie, durch die Blick auf die Daten, die sie scheinen zu bedeuten, UTF-16 Im sicher Mac OS und nix Editoren haben ein ähnliches Feature.) Heres Eine Seite, die das Ergebnis des Lesens einer Datei auf beide Weisen ablegt: Wenn ich das mit einer Testversion 1 2 3 Datei verwende, die in UTF-16 gespeichert ist, hier sind die Ergebnisse, die ich bekomme: Wie du sehen kannst, hat readAsText die Charaktere interpretiert und so bekam ich 13 (die Länge von Testing 1 2 3) und readAsBinaryString didnt, und so bekam ich 28 (die Zwei-Byte-Stückliste plus zwei Bytes für jedes Zeichen). XMLHttpRequest. response mit responseType arraybuffer wird in HTML 5 unterstützt. JavaScript-Strings sind UTF-16 mag wie eine ungerade Aussage arent sie nur Unicode Nein, ein JavaScript-String ist eine Reihe von UTF-16 Code-Einheiten sehen Sie Surrogat-Paare als zwei einzelne JavaScript Charaktere, obwohl in der Tat das Surrogat-Paar als Ganzes nur ein Charakter ist. Siehe den Link für Details. DigitalFresh: Die Zeichenfolge ist die Binärdaten. Wie du kommentiert hast, habe ich ein Beispiel geschrieben, das helfen kann. JavaScript doesn39t haben einen quotbinaryquot Typ und so gingen sie mit einem String mit der Garantie, dass kein Zeichen in der Zeichenfolge lag außerhalb des Bereichs 0..255. (Sie könnten stattdessen mit einer Reihe von Zahlen gegangen sein, aber sie haben es nicht getan.) Das Beispiel zeigt, wie man den Rohwert eines Quatscharktes aus der Zeichenkette erhält. Ndash T. J. Crowder Jun 30 10 at 5:09 morpheus: Weil dieses Zeug asynchron ist, kann es Ausnahmen, die du brauchst, um die Schnittstelle zu sehen, um zu sehen, ob es irgendeine asynchrone Art und Weise gibt es Fehler. Und in der Tat hat FileReader dazu geführt. Wenn du eine Datei nimmst: 4747 URL, deine Dokumentdomäne ist null, was dazu neigt, dich von vielen Dingen zu beenden (ich kenne die Details nicht, ich mache es nie), esp. Wenn die SOP hineingeht. I39m ziemlich sicher it39s bis zum Browser, zumindest für jetzt, da der Sicherheitsteil der Spezifikation noch vorläufig ist: w3.orgTRFileAPIsecurity-Diskussion Aber ich würde es nicht erwarten zu arbeiten. Ndash T. J. Crowder Nov 5 10 at 18:12 Vielen Dank TJCrowder - Ich habe meinen Kommentar gelöscht, um zu verhindern, dass andere von meiner Vereinfachung irregeführt werden, und danke für die Veröffentlichung der Details - ich bin mir sicher, dass andere deine Kommentare viel mehr hilfreich finden (und das Lesen der Artikel ist wirklich eine gute Idee, wie Sie sagen, wenn man in diesem Bereich herumtreibt). Ndash Brian M. Hunt Dec 30 14 at 14: 16As Teil einer Reihe von Artikeln, die ich diskutiere einige der Herausforderungen, die ich konfrontiert, wenn ich versuche, eine HTML5 und JavaScript kostenlose Online-Icons Editor zu bauen. Ich wollte, dass Benutzer in der Lage sind, vorhandene Icon-Dateien in meinem Icon-Editor zu öffnen und zu bearbeiten. Da Icon-Dateien mehrere Frames enthalten können, musste ich auf diese einzelnen Frames zugreifen, damit sie angezeigt und für den Benutzer verfügbar sein können. Die Anzahl, Größe und Lage der in einem Symbol enthaltenen Frames sind alle im Icon Header gespeichert. Der Icon-Header ist ein Sammlungsbytes, das sich am Anfang einer Icon-Datei befindet, also musste ich die in der Datei enthaltenen Binärdaten lesen. Wir können jetzt Dateien einfach im Browser lesen, ohne dass wir keine Daten an einen Server senden müssen. In dieser Tranche zeige ich, wie man mit der HTML5 File API binäre Daten einer lokalen Datei im Browser lesen kann. Um zu beginnen, würde man ein Eingabeelement hinzufügen und das Typattribut auf Datei setzen, dann werden wir in einem Script-Block die Datei-Eingaben auf das Exchange-Ereignis behandeln. lt Körper gt160160160160160160160160160160160160160160160160160160160160160160160160160160160160 160.160.160.160 lt input id quotbrowseOpenquot Typ quotfilequot gt 160.160.160.160 lt script type quottextjavascriptquot gt 160160160160160160160160 var FileInput - document. getElementById (quotbrowseOpenquot) 160160160160160160160160 fileInput. onchange function () 160160160160160160160160160160160160-Code onChange Ereignis zu behandeln geht hier 160160160160 160160160160 160160160160 lt Skript gt lt Körper gt Jetzt müssen wir den Code hinzufügen, um das onchange - Ereignis zu behandeln. Hier werden wir ein FileReader-Objekt erstellen. Wir verwenden die readAsBinaryString-Methode des FileReader-Objekts, die uns die rohen Binärdaten gibt. Wir können ein File-Objekt an den readAsBinaryString übergeben, wenn wir die ganze Datei lesen wollen oder ein Blob-Objekt übergeben können, wenn wir nur einen bestimmten Abschnitt einer Datei lesen wollen. In diesem Beispiel werden wir ein File-Objekt übergeben, um die gesamte Datei zu lesen. Wir müssen auch das onladend-Ereignis des FileReaders behandeln, da die Daten, die wir mit readAsBinaryString lesen, nur verfügbar sind, wenn die gesamte Datei oder der Blob vom FileReader gelesen wurde. Unser Code in der onchange Event-Handler sieht jetzt so aus. 160160160160160160160160 var fr new FileReader () 160160160160160160160160 fr. onloadd Funktion () 160160160160160160160160160160160160 Code zum Umgang mit geladenem Ereignis 160160160160 160160160160 160160160160160160160160 fr. readAsBinaryString (diese. files 0) Im onladend Event-Handler können wir auf die Daten zugreifen, die gerade über die FileReader gelesen wurden Ergebnisattribut. Wir können dann das Ergebnisattribut durchlaufen und die Methode charCodeAt aufrufen, um einen Integer-Wert jedes Bytes zurückzugeben. In diesem Beispiel werde ich das Byte in eine hexadezimale Stringdarstellung mit toString (16) konvertieren, eine lange Zeichenkette aufbauen und dann den String dem Benutzer anzeigen. Heres das volle Arbeitsbeispiel. lt DOCTYPE HTML gt lt html gt lt Kopf gt 160160160160 lt Titel gtReading Binärdaten mit dem File API und JavaScriptlt Titel gt lt Kopf gt lt Körper gt160160160160160160160160160160160160160160160160160160160160160160160160160160160160 160160160160 lt input id quotbrowseOpenquot Typ quotfilequot gt 160160160160 lt script type quottextjavascriptquot gt 160160160160160160160160 var FileInput - document. getElementById (quotbrowseOpenquot) 160160160160160160160160 fileInput. onchange function () 160160160160160160160160160160160160 var fr neue Filereader () 160160160160160160160160160160160160 fr. onloadend function () 160160160160160160160160160160160160160160160160 var Ergebnis dieser. RESULT 160160160160160160160160160160160160160160160160 var hex quotquot 160160160160160160160160160160160160160160160160 for (var i 0 i lt dieses. result. length i) 160160160160160160160160160160160160160160160160160160160160 var byteStr result. charCodeAt (i).toString (16) 160160160160160160160160160160160160160160160160160160160160 if (byteStr. length lt 2) 160160160160160160160160160160160160160160160160160160160160160160160160 byteStr quot0quot byteStr 160160160160160160160160160160160160160160160160160160160160 160160160160160160160160160160160160160160160160160160160160 hex quot quot byteStr 160160160160160160160160160160160160160160160160 160160160160160160160160160160160160160160160160 alert (hex) 160160160160160160160160160160160160 160160160160160160160160160160160160 fr. readAsBinaryString (diese. files 0) 160160160160160160160160 160160160160 lt script gt lt body gt lt html gtjDataView bietet eine Standardmethode, um Binärdateien in allen Browsern zu lesen. Es folgt die DataView Spezifikation und verlängert sie sogar für eine praktischere Anwendung. Erläuterung Es gibt drei Möglichkeiten, eine Binärdatei aus dem Browser zu lesen. Die erste ist, die Datei durch XHR mit charsetx-user-defined herunterzuladen. Sie erhalten die Datei als String. Und du musst alle Decodierungsfunktionen umschreiben (getUint16, getFloat32.). Alle Browser unterstützen das. Dann haben Browser, die WebGL implementiert haben, auch ArrayBuffers hinzugefügt. Es ist ein einfacher Puffer, der mit Ansichten mit dem Namen TypedArrays (Int32Array, Float64Array) gelesen werden kann. Sie können sie verwenden, um die Datei zu dekodieren, aber das ist nicht sehr praktisch. Es hat großen Nachteil, es kann nicht lesen, non-aligned Daten. Es wird von Firefox 4 und Chrome 7 unterstützt. Eine neue Revision der Spezifikation hinzugefügt DataViews. Es ist eine Ansicht um Ihren Puffer, der beliebige Datentypen direkt über Funktionen lesen kann: getUint32, getFloat64. Nur Chrome 9 unterstützt es. JDataView stellt die DataView API für alle Browser zur Verfügung, wobei die beste verfügbare Option zwischen Strings, TypedArrays und DataViews verwendet wird. Siehe die Spezifikation für eine detaillierte API. Khronos. orgregistrywebgldocspecTypedArray-spec. html6. Jeder Code, der für DataView geschrieben wird, wird mit jDataView arbeiten (außer wenn er etwas schreibt). Konstruktor neue jDataView (Puffer, Offset, Länge). Puffer kann entweder eine String oder eine ArrayBuffer Spezifikation API sein Der Wrapper erfüllt alle Spezifikation Getter. GetInt8 (byteOffset, littleEndian) getInint16 (byteOffset, littleEndian) getUint16 (byteOffset, littleEndian) getInint32 (byteOffset, littleEndian) getUint32 (byteOffset, littleEndian) getUint32 (byteOffset, littleEndian) getFloat32 (byteOffset, littleEndian) getFloat64 (byteOffset, littleEndian) Erweiterte Spezifikation Der Parameter byteOffset ist Jetzt optional Wenn du es weglisst, liest es nach dem letzten Leseoffset. Mit diesen internen Zeigern können Sie mit diesen beiden Funktionen interagieren. Suche (byteOffset): Verschiebt den internen Zeiger auf die Position tell (): Liefert die aktuelle Position Hinzufügen von getChar - und getString-Dienstprogrammen. Hinzufügen von createBuffer, ein Dienstprogramm, um einfach Puffer mit dem neuesten verfügbaren Speichertyp (String oder ArrayBuffer) zu erstellen. Unzulänglichkeiten Nur die Lese-API wird eingewickelt, jDataView stellt keine Set-Methode zur Verfügung. Die Float64-Implementierung auf Strings hat keine volle Präzision. Zuerst brauchen wir eine Datei. Entweder man bekommt es durch XHR oder benutzt das createBuffer Dienstprogramm.


No comments:

Post a Comment