Files
2025-02-26 14:49:25 +07:00

148 lines
3.3 KiB
JavaScript

/**
* BinFileReader.js
* You can find more about this function at
* http://nagoon97.com/reading-binary-files-using-ajax/
*
* Copyright (c) 2008 Andy G.P. Na <nagoon97@naver.com>
* The source code is freely distributable under the terms of an MIT-style license.
*/
function BinFileReader(fileURL){
var _exception = {};
_exception.FileLoadFailed = 1;
_exception.EOFReached = 2;
var filePointer = 0;
var fileSize = -1;
var fileContents;
this.getFileSize = function(){
return fileSize;
}
this.getFilePointer = function(){
return filePointer;
}
this.readBytes=function()
{
return fileContents;
}
this.movePointerTo = function(iTo){
if(iTo < 0) filePointer = 0;
else if(iTo > this.getFileSize()) throwException(_exception.EOFReached);
else filePointer = iTo;
return filePointer;
};
this.movePointer = function(iDirection){
this.movePointerTo(filePointer + iDirection);
return filePointer;
};
this.readNumber = function(iNumBytes, iFrom){
iNumBytes = iNumBytes || 1;
iFrom = iFrom || filePointer;
this.movePointerTo(iFrom + iNumBytes);
var result = 0;
for(var i=iFrom + iNumBytes; i>iFrom; i--){
result = result * 256 + this.readByteAt(i-1);
}
return result;
};
this.readString = function(iNumChars, iFrom){
iNumChars = iNumChars || 1;
iFrom = iFrom || filePointer;
this.movePointerTo(iFrom);
var result = "";
var tmpTo = iFrom + iNumChars;
for(var i=iFrom; i<tmpTo; i++){
result += String.fromCharCode(this.readNumber(1));
}
return result;
};
this.getBytes = function(iFrom) {
this.movePointerTo(iFrom);
var tmpTo = fileContents.length;
var result = new Uint8Array(tmpTo-iFrom);
var index = 0;
for(var i=iFrom;i<tmpTo;i++) {
result[index] = this.readByteAt(i);
index++;
}
return result;
};
this.readUnicodeString = function(iNumChars, iFrom){
iNumChars = iNumChars || 1;
iFrom = iFrom || filePointer;
this.movePointerTo(iFrom);
var result = "";
var tmpTo = iFrom + iNumChars*2;
for(var i=iFrom; i<tmpTo; i+=2){
result += String.fromCharCode(this.readNumber(2));
}
return result;
};
function throwException(errorCode){
switch(errorCode){
case _exception.FileLoadFailed:
throw new Error('Error: Filed to load "'+fileURL+'"');
break;
case _exception.EOFReached:
throw new Error("Error: EOF reached");
break;
}
}
function BinFileReaderImpl_IE(fileURL){
var vbArr = BinFileReaderImpl_IE_VBAjaxLoader(fileURL);
fileContents = vbArr.toArray();
fileSize = fileContents.length-1;
if(fileSize < 0) throwException(_exception.FileLoadFailed);
this.readByteAt = function(i){
return fileContents[i];
}
}
function BinFileReaderImpl(fileURL){
var req = new XMLHttpRequest();
req.open('GET', fileURL, false);
//XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
req.overrideMimeType('text/plain; charset=x-user-defined');
req.send(null);
if (req.status != 200) throwException(_exception.FileLoadFailed);
{
fileContents = req.responseText;
}
fileSize = fileContents.length;
this.readByteAt = function(i){
return fileContents.charCodeAt(i) & 0xff;
}
}
if(/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent))
BinFileReaderImpl_IE.apply(this, [fileURL]);
else
BinFileReaderImpl.apply(this, [fileURL]);
}