Friday 3 November 2017

Javascript Les Fil As Binære Alternativer


readAsBinaryString sier at dataene må være representert som en binær streng. hvor: hver byte er representert ved et heltall i området 0..255. JavaScript opprinnelig hadde ikke en binær type (til ECMAScript 5s WebGL-støtte av Typed Array (detaljer nedenfor) - det har blitt erstattet av ECMAScript 2015s ArrayBuffer) og så gikk de med en streng med garantien om at ingen tegn lagret i strengen ville være utenfor området 0..255. (De kunne ha gått med en rekke tall i stedet, men de gjorde kanskje ikke store strenge er mer minneeffektive enn store tallrike tall, siden tallene er flytende punkt.) Hvis du leser en fil, er det mest tekst i et vestlig skript ( for det meste engelsk, for eksempel), så vil den strengen se ut som tekst. Hvis du leser en fil med Unicode-tegn i den, bør du merke en forskjell, siden JavaScript-strenger er UTF-16 (detaljer nedenfor), og noen tegn vil ha verdier over 255, mens en binær streng ifølge File API-spesifikasjonen ikke ville ha noen verdier over 255 (du har to individuelle tegn for de to byte av Unicode-kodepunktet). Hvis du leser en fil som ikke er tekst i det hele tatt (et bilde, kanskje), får du sannsynligvis fortsatt et veldig lignende resultat mellom readAsText og readAsBinaryString. men med readAsBinaryString vet du at det ikke vil være noe forsøk på å tolke multi-byte-sekvenser som tegn. Du vet ikke det hvis du bruker readAsText. fordi readAsText vil bruke en kodingsbestemmelse for å prøve å finne ut hva filene koder for, og deretter legge det til JavaScripts UTF-16 strenger. Du kan se effekten hvis du lager en fil og lagrer den i noe annet enn ASCII eller UTF-8. (I Windows kan du gjøre dette via Notisblokk Save As som en koding-rullegardin med Unicode på den, ved å se på dataene de synes å bety UTF-16 Im sikker på at Mac OS og nix redaktører har en lignende funksjon.) Heres en side som dumper resultatet av å lese en fil på begge måter: Hvis jeg bruker det med en Testing 1 2 3-fil som er lagret i UTF-16, er det resultatene jeg får: Som du kan se, lestAsText tolket tegnene og så fikk jeg 13 (lengden av testing 1 2 3), og readAsBinaryString gjorde det ikke, og så fikk jeg 28 (tobyte-BOM pluss to byte for hvert tegn). XMLHttpRequest. response med responseType arraybuffer støttes i HTML 5. JavaScript strenger er UTF-16 kan virke som en merkelig uttalelse arent de bare Unicode Nei, en JavaScript-streng er en serie UTF-16 kodeenheter du ser surrogatpar som to individuelle JavaScript tegn selv om faktisk surrogatparet som helhet er bare ett tegn. Se lenken for detaljer. digitalFresh: Strengen er binære data. Som du kommenterte, postet jeg et eksempel som kan hjelpe. JavaScript har ikke en quotbinaryquot-type, og så gikk de med en streng med garantien om at ingen tegn lagret i strengen ville ligge utenfor området 0..255. (De kunne ha gått med en rekke tall i stedet, men de gjorde ikke.) Eksemplet viser hvordan man får den råverdien av en quotcharacterquot fra strengen. ndash T. J. Crowder Jun 30 10 at 5:09 morpheus: Fordi disse tingene er asynkrone, kan det ikke kaste unntak du må se på grensesnittet for å se om det er noe asynkron måte det rapporterer feil. Og faktisk, FileReader har bekymring for dette. Når du bruker en fil: 4747 URL, er dokumentdomenet ditt null, som har en tendens til å lukke deg av fra mange ting (jeg vet ikke detaljene, det gjør jeg aldri), esp. når SOP kommer inn i den. Jeg er ganske sikker på at det er opp til nettleseren, i hvert fall for nå, siden sikkerhetsdelen av spesifikasjonen fortsatt er foreløpig: w3.orgTRFileAPIsecurity-diskusjon Men jeg ville ikke forvente at det skulle fungere. ndash T. J. Crowder Nov 5 10 at 18:12 Mange takk TJCrowder - Jeg slettet min kommentar for å forhindre at andre blir villedet av min oversimplification, og takk for at du sendte detaljene. Jeg er sikker på at andre vil finne kommentarene dine mye mer hjelpsomme (og leser artikkelen er virkelig en god ide, som du sier, hvis man mucking rundt i dette området). ndash Brian M. Hunt 30 desember 14 kl 14: 16 Som en del av en serie artikler diskuterer jeg noen av utfordringene jeg møtte da jeg prøvde å bygge en HTML5 og JavaScript gratis online ikoner redaktør. Jeg ønsket at brukerne kunne åpne og redigere eksisterende ikonfiler i ikoneditoren. Som ikonfiler kan inneholde flere rammer, trengte jeg tilgang til disse individuelle rammene slik at de kan vises og være tilgjengelige for å redigere for brukeren. Antallet, størrelsen og plasseringen av rammer som finnes i et ikon, lagres alle i ikonoverskriften. Ikonoverskriften er en samlingsbyte som ligger i starten av en ikonfil, så jeg trengte å lese de binære dataene i filen. Vi kan nå lese filer enkelt i nettleseren uten å måtte sende data tilbake til en server. I denne delen viser jeg hvordan du kan lese binære data for en lokal fil i nettleseren ved hjelp av HTML5 File API. Til å begynne med skulle legge til et innspillingselement og sette typeattributtet til fil, og i en skriptblokk skal vi håndtere filinngangene på byttehendelse. lt legeme gt160160160160160160160160160160160160160160160160160160160160160160160160160160160160 160160160160 lt inngangs id quotbrowseOpenquot typen quotfilequot gt 160160160160 lt script type quottextjavascriptquot gt 160160160160160160160160 Var fileInput document. getElementById (quotbrowseOpenquot) 160160160160160160160160 fileInput. onchange funksjon () 160160160160160160160160160160160160 kode for å håndtere OnChange arrangementet går her 160 160 160 160 160 160 160 160 160 160 160 160 lt skriptet gt lt legeme gt Nå må vi legge til koden for å håndtere endringshendelsen. Her skal vi lage et FileReader-objekt. Vi vil bruke readAsBinaryString-metoden i FileReader-objektet som gir oss de rå binære dataene. Vi kan sende et filobjekt til readAsBinaryString hvis vi vil lese hele filen eller vi kan sende et Blob-objekt hvis vi bare vil lese en bestemt del av en fil. I dette eksemplet skal vi sende et filobjekt for å lese hele filen. Vi må også håndtere overloadend-hendelsen i FileReader, da dataene vi leser med readAsBinaryString, bare er tilgjengelig for bruk når hele filen eller blob-filen er lest av FileReader. Vår kode i hendelsesbehandleren på utveksling ser nå ut som dette. 160160160160160160160160 var fr ny FileReader () 160160160160160160160160 fr. onloadend-funksjon () 160160160160160160160160160160160160 Kode for å håndtere onloadend-hendelse 160160160160 160160160160 160160160160160160160160 fr. readAsBinaryString (denne. files 0) I den overloadende hendelsesbehandleren kan vi få tilgang til dataene som nettopp har blitt lest via FileReaders resultatattributt. Vi kan da løpe gjennom resultatattributtet og ringe charCodeAt-metoden for å returnere en heltallverd av hver byte. I dette eksemplet skal jeg konvertere byte til en heksadesimal strengrepresentasjon ved hjelp av toString (16), bygge opp en lang streng og deretter vise strengen til brukeren. Heres det fulle arbeidende eksemplet. lt DOCTYPE HTML gt lt html gt lt hode gt 160160160160 lt tittel gtReading Binære data med File API og JavaScriptlt tittel gt lt hode gt lt legeme gt160160160160160160160160160160160160160160160160160160160160160160160160160160160160 160160160160 lt inngangs id quotbrowseOpenquot typen quotfilequot gt 160160160160 lt script type quottextjavascriptquot gt 160160160160160160160160 Var fileInput document. getElementById (quotbrowseOpenquot) 160160160160160160160160 fileInput. onchange funksjon () 160160160160160160160160160160160160 Var fr ny Reader () 160160160160160160160160160160160160 fr. onloadend funksjon () 160160160160160160160160160160160160160160160160 Var resultat av dette. result 160160160160160160160160160160160160160160160160 Var-hex quotquot 160160160160160160160160160160160160160160160160 for (var i 0 i lt denne. result. length i) 160160160160160160160160160160160160160160160160160160160160 var byteStr result. charCodeAt (i).toString (16) 160160160160160160160160160160160 160160160160160160160160160 if (byteStr. length lt 2) 160160160160160160160160160160160160160160160160160160160160160160160160 byteStr quot0quot byteStr 160160160160160160160160160160160160160160160160160160160160 160160160160160160160160160160160160160160160160160160160160 hex quot quot byteStr 160160160160160160160160160160160160160160160160 160160160160160160160160160160160160160160160160 alert (hex) 160160160160160160160160160160160160 160160160160160160160160160160160160 fr. readAsBinaryString (dette. files 0) 160160160160160160160160 160160160160 lt skriptet gt lt legeme gt lt html gtjDataView gir en standard måte å lese binære filer i alle nettleserne. Det følger DataView-spesifikasjonen og utvider den til en mer praktisk bruk. Forklaring Det er tre måter å lese en binærfil fra nettleseren på. Den første er å laste ned filen gjennom XHR med charsetx-brukerdefinert. Du får filen som en streng. og du må omskrive alle dekoderingsfunksjonene (getUint16, getFloat32.). Alle nettleserne støtter dette. Da ble nettlesere som implementerte WebGL også lagt til ArrayBuffers. Det er en vanlig buffer som kan leses med visninger som heter TypedArrays (Int32Array, Float64Array.). Du kan bruke dem til å dekode filen, men dette er ikke veldig nyttig. Det har stor ulempe, det kan ikke lese ikke-justerte data. Den støttes av Firefox 4 og Chrome 7. En ny revisjon av spesifikasjonen lagde DataViews. Det er en visning rundt bufferen din som kan lese vilkårlig datatyper direkte gjennom funksjoner: getUint32, getFloat64. Bare Chrome 9 støtter det. jDataView gir DataView API for alle nettlesere som bruker det beste tilgjengelige alternativet mellom Strings, TypedArrays og DataViews. Se spesifikasjonen for en detaljert API. khronos. orgregistrywebgldocspecTypedArray-spec. html6. Enhver kode som er skrevet for DataView, vil fungere med jDataView (unntatt hvis den skriver noe). Konstruer ny jDataView (buffer, offset, lengde). bufferen kan enten være en streng eller en ArrayBuffer-spesifikasjon API. Innpakningen tilfredsstiller alle spesifikasjon getters. getInt8 (byteOffset) getInt16 (byteOffset, littleEndian) getFloat64 (byteOffset, littleEndian) Utvidet spesifikasjon Parameteren byteOffset er byttOffset (byteOffset, littleEndian) getInt32 (byteOffset, littleEndian) nå valgfritt. Hvis du utelater det, vil den lese rett etter den siste leseforskyvningen. Du kan samhandle med den interne pekeren med de to funksjonene. søk (byteOffset): Flytter den indre pekeren til stillingsfortellingen (): Returnerer gjeldende posisjon Tilgang til getChar og getString-verktøy. Tilgang til createBuffer, et verktøy for å enkelt lage buffere med den nyeste tilgjengelige lagringstypen (String eller ArrayBuffer). Mangler Bare Read-API-en pakkes inn, jDataView gir ingen bestemt metode. Float64-implementeringen på strenger har ikke full presisjon. Først trenger vi en fil. Enten får du det gjennom XHR eller bruker createBuffer-verktøyet.

No comments:

Post a Comment