2015-07-31 18 views
6

Muszę odczytać dane z pliku. Te dane zostały zapisane do pliku w bajtach serwera. Plik ma poprawioną strukturę, teraz chcę przeczytać zawarte w nim informacje z JS.Czytaj bajt pliku na bajt i parsuj do int

znalazłem http://www.html5rocks.com/en/tutorials/file/dndfiles/ i kopiowane ją pobawić: http://jsfiddle.net/egLof4ph/

function readBlob(opt_startByte, opt_stopByte) { 

    var files = document.getElementById('files').files; 
    if (!files.length) { 
     alert('Please select a file!'); 
     return; 
    } 

    var file = files[0]; 
    var start = parseInt(opt_startByte) || 0; 
    var stop = parseInt(opt_stopByte) || file.size - 1; 

    var reader = new FileReader(); 

    // If we use onloadend, we need to check the readyState. 
    reader.onloadend = function(evt) { 
     if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
      document.getElementById('byte_content').textContent = evt.target.result; 
      document.getElementById('byte_range').textContent = ['Read bytes: ', start + 1, ' - ', stop + 1, 
       ' of ', file.size, ' byte file'].join(''); 
     } 
    }; 

    var blob = file.slice(start, stop); 

var a = reader.readAsBinaryString(blob); 

} 

document.querySelector('.readBytesButtons').addEventListener('click', function(evt) { 
    if (evt.target.tagName.toLowerCase() == 'button') { 
     var startByte = evt.target.getAttribute('data-startbyte'); 
     var endByte = evt.target.getAttribute('data-endbyte'); 
     readBlob(startByte, endByte); 
    } 
}, false); 

Wiedziałem, że pierwsze 7 bajtów są tragiczne i można je wyrzucić. Kolejne 68 bajtów należy do siebie i każda wartość ma rozmiar 4 bajty. Po 68 bajtach ponownie przychodzi 68 użytecznych bajtów (68 bajtów to "szczeliny czasowe").

Moje pytanie: Kiedy używam że kod otrzymuję wiele znaków (A, Q, & & &, znaki specjalne, ..), ale dane są w rzeczywistości tęskni. Jak mogę je przeanalizować w Numbers? Zgodnie z API Filereader readAsBinarsString() zwraca surowe dane binarne. I jak poprawnie przeanalizować cały plik?

Tak, oryginalny plik wygląda tak:

<7B>Metadata</7B><4B>long value</4B>....17times for each timeslot  <4B>long value</4B>....17times again.... and this util the end of the file. 

Kiedy Używam powyższy kod otrzymuję wyjścia jak: & & WK

Ponadto znalazłem: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays (ponieważ FileReader dostarcza metodę, która zwraca ArrayBuffer), więc domyślam się, że powinienem użyć readAsArrayBuffer(), ale jak użyć go, by dostać się do moich danych?

+0

Czy masz przykład pliku, który chcesz przeanalizować? –

+0

Niestety nie, mam tylko plik, w którym mogę zobaczyć, jak wyglądają oryginalne dane. Aktualizuję to w moim przewodniku pocztowym. – EsoMoa

+0

Czy naprawdę tego potrzebujesz? Dlaczego nie przeczytać/przetworzyć pliku na serwerze i zwrócić Int, którego potrzebujesz? – Fals

Odpowiedz

0

Naprawdę potrzebujesz plików binarnych?

Uwaga: metoda readAsBinaryString jest teraz uznawana za przestarzałą, zgodnie z wersją roboczą z dnia 12 lipca 2012 r. Z W3C.

function readBlob(opt_startByte, opt_stopByte) { 

    var files = document.getElementById('files').files; 
    if (!files.length) { 
     alert('Please select a file!'); 
     return; 
    } 

    var file = files[0]; 
    var start = parseInt(opt_startByte) || 0; 
    var stop = parseInt(opt_stopByte) || file.size - 1; 

    var reader = new FileReader(); 
    reader.onloadend = function (evt) { 

     if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
     var a = new Uint8Array(evt.target.result) 
     var binary = "" 
     for (var i =0; i <= a.length; i++) { 
      binary += Number(a[i]).toString(2) 
     } 
     document.getElementById('byte_content').textContent = binary; 
     document.getElementById('byte_range').textContent = ['Read bytes: ', start + 1, ' - ', stop + 1, 
      ' of ', file.size, ' byte file'].join(''); 
     } 
    };; 


    var blob = file.slice(start, stop); 
    var a = reader.readAsArrayBuffer(blob) 
    } 

    document.querySelector('.readBytesButtons').addEventListener('click', function (evt) { 
    if (evt.target.tagName.toLowerCase() == 'button') { 
     var startByte = evt.target.getAttribute('data-startbyte'); 
     var endByte = evt.target.getAttribute('data-endbyte'); 
     readBlob(startByte, endByte); 
    } 
    }, false); 
+0

Nie wolno mi dotykać kodowania, więc tak, nie można zmienić tego, że jest binarny. Tak, wczoraj ponownie wyczytałem, że readAs ... nic nie zwraca, w przeciwieństwie do tego, co myślałem, nie widziałem wyniku atrybutu. Czy jest jakaś różnica, jeśli używam Tablicy Typów lub DataView? – EsoMoa