2011-11-10 88 views
2

here的Javascript二進制文件讀取

_shl: function (a, b){ 
     for (++b; --b; a = ((a %= 0x7fffffff + 1) & 0x40000000) == 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1); 
     return a; 
    }, 

_readByte: function (i, size) { 
     return this._buffer.charCodeAt(this._pos + size - i - 1) & 0xff; 
    }, 

_readBits: function (start, length, size) { 
     var offsetLeft = (start + length) % 8; 
     var offsetRight = start % 8; 
     var curByte = size - (start >> 3) - 1; 
     var lastByte = size + (-(start + length) >> 3); 
     var diff = curByte - lastByte; 

     var sum = (this._readByte(curByte, size) >> offsetRight) & ((1 << (diff ? 8 - offsetRight : length)) - 1); 

     if (diff && offsetLeft) { 
      sum += (this._readByte(lastByte++, size) & ((1 << offsetLeft) - 1)) << (diff-- << 3) - offsetRight; 
     } 

     while (diff) { 
      sum += this._shl(this._readByte(lastByte++, size), (diff-- << 3) - offsetRight); 
     } 

     return sum; 
    }, 

此代碼的二進制文件的閱讀。不幸的是,這個代碼沒有記錄。 我想了解它是如何工作的。 (特別是_readBits和_shl方法) 在_readBits什麼是offign的?也curByte和lastByte: 我認爲這樣的方式:

_readBits(0,16,2)curByte成爲1. lastByte成爲0.爲什麼lastByte小於curByte?或者我犯了一個錯誤?哪裏?請幫忙!

+0

@ Bakudan-ханювиги這並不奇怪,注意'++ b'只執行一次。 – ExpExc

+0

我更喜歡binaryAjax.js - http://www.nihilogic.dk/labs/binaryajax/binaryajax.js - 你可以在它的網站上找到一些幫助。 – Luc125

回答

0
  • _readByte(i, size)size是在字節的緩衝區長度,i是要讀取字節的逆轉指數(從緩衝區末尾索引,而不是從一開始)。
  • _readBits(start, length, size)size是在字節的緩衝區長度,length是要讀取的比特數,start是要讀出的第一位的索引
  • _shl(a, b):將讀取字節a轉換爲基於其索引b的實際值。

因爲_readByte使用反轉索引,所以lastByte小於curByte

offsetLeftoffsetRight用於分別從lastBytecurByte中刪除無關位(不在讀取範圍內的位)。

0

我不確定代碼是如何跨瀏覽器的。我使用下面的方法來讀取二進制數據。 IE瀏覽器有一些無法用Javascript解決的問題,你需要用VB編寫的小型幫助函數。 Here是一個完全跨瀏覽器的二進制閱讀器類。如果你只是想,如果沒有所有的輔助功能重要的位,只需添加到您的類需要讀取二進制結尾:

// Add the helper functions in vbscript for IE browsers 
// From https://gist.github.com/161492 
if ($.browser.msie) { 
    document.write(
     "<script type='text/vbscript'>\r\n" 
     + "Function IEBinary_getByteAt(strBinary, iOffset)\r\n" 
     + " IEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\n" 
     + "End Function\r\n" 
     + "Function IEBinary_getLength(strBinary)\r\n" 
     + " IEBinary_getLength = LenB(strBinary)\r\n" 
     + "End Function\r\n" 
     + "</script>\r\n" 
    ); 
} 

然後你就可以挑什麼就在你的類中添加:

// Define the binary accessor function 
if ($.browser.msie) { 
     this.getByteAt = function(binData, offset) { 
     return IEBinary_getByteAt(binData, offset); 
    } 
} else { 
    this.getByteAt = function(binData, offset) { 
     return binData.charCodeAt(offset) & 0xFF; 
    } 
} 

現在你可以讀取的字節中所有你想要

var byte = getByteAt.call(this, rawData, dataPos);