2015-07-31 13 views
6

Bir dosyadan veri okumam gerekiyor. Bu veriler bir sunucu tarafından bayt-lise dosyaya yazılmıştır. Dosyada sabit bir yapı var, şimdi de bu bilgiyi JS ile okumak istiyorum.Okunan dosyayı bayt olarak okuyun ve int için ayrıştırın

Ben http://www.html5rocks.com/en/tutorials/file/dndfiles/ bulundu ve keman aşağı kopyaladık: Ben ilk 7 Bayt bok vardır ve onları atabilir biliyordu 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); 

. Sonraki 68Bytes birbirine aittir ve her değer 4byte büyüktür. 68Biyte sonra tekrar kullanılabilir 68 bayt (68baytlar "zaman dilimleri" dir).

Sorum: Ben Kod birçok işaretleri almak kullanıyorum (A, Q, & & &, özel karakter, ..), ancak veri gerçeklik uzun ürünler bulunmaktadır. Onları Sayılara nasıl ayrıştırabilirim? Filereader API'ye göre readAsBinarsString(), ham ikili verileri döndürür. Ve tüm dosya nasıl doğru ayrıştırmak için?

Yani, orijinal dosya şuna benzer:

Ben olsun yukarıdaki kod kullanıyorum
<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. 

gibi çıktı: Ben bulduk & & WK Dahası

: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays (FileReader bir ArrayBuffer döndüren bir yöntem sağladığından, bu yüzden readAsArrayBuffer() kullanmalıyım, ancak verilerime ulaşmak için nasıl kullanılır?

+0

Ayrıştırmak istediğiniz dosyayla ilgili bir örnek var mı? –

+0

Maalesef, orijinal verilerin nasıl göründüğünü görebildiğim bir Dosyam var. Bunu Startingpost'umda güncelliyorum. – EsoMoa

+0

Gerçekten buna ihtiyacın var mı? Neden dosyayı sunucuda okumaz/işlemez ve İhtiyacınız olan Int'i iade etmiyorsunuz? – Fals

cevap

0

Gerçekten ikili dosyaya mı ihtiyacınız var?

readAsBinaryString yönteminin artık W3C'den 12 Temmuz 2012 Çalışma Taslağına göre kullanımdan kaldırıldığını unutmayın.

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

Kodlama'ya dokunmama izin verilmiyor, yani, ikili olduğunu değiştiremiyorum. Evet, dün okudum ki ... ... okuduğum şeyden farklı olarak ... ... hiçbir şey vermez, öznitelik sonucunu görmedim. Typed Array veya DataView kullanırsam herhangi bir fark var mı? – EsoMoa

İlgili konular