0

この質問では、この情報を使用してBLBファイルを読み取る方法についての回答を得ました。だから私は指示に従いました、そして私はヘッダーを正しく読んでいるようです。

ただし、ファイルIDを読み取ろうとすると、ファイルの終了ランタイムエラーが発生します。

[Fault] exception, information=Error: Error #2030: End of file was encountered.

これが私のコードです。

基本クラス:

package  
{
    import flash.display.Sprite;
    import flash.filesystem.File;
    import flash.filesystem.FileStream;
    import flash.utils.ByteArray;
    import flash.utils.IDataInput;
    import flash.filesystem.FileMode;

    public class BLBDecompress extends Sprite 
    {
        private var _file:File;
        private var _stream:FileStream;

        private var _blbBytes:ByteArray;

        private var _header:Header;
        private var _fileIDs:Array;

        public function BLBDecompress() 
        {
            decompress();
        }

        private function decompress():void
        {
            _file = File.applicationDirectory.resolvePath("testfiles/t.blb");
            _blbBytes = new ByteArray();

            _stream = new FileStream();
            _stream.open(_file, FileMode.READ);
            _stream.readBytes(_blbBytes);
            _stream.close();

            _header = readHeader(_blbBytes);

            _fileIDs = new Array();

            for (var i:int = 0; i < _header.dwNumber; i++)
            {
                _fileIDs.push(readFileID(_blbBytes));
            }
        }

        private function readHeader(input:IDataInput):Header
        {
            var header:Header = new Header();

            header.szID = new ByteArray();
            input.readBytes(header.szID, 0, 4);

            header.bID = input.readUnsignedByte();
            header.bUnknown = input.readUnsignedByte();
            header.wDataSize = input.readUnsignedShort();
            header.dwFileSize = input.readUnsignedInt();
            header.dwNumber = input.readUnsignedInt();

            return header;
        }

        private function readFileID(input:IDataInput):uint
        {
            var fileID:uint = input.readUnsignedInt();

            return fileID;
        }
    }
}

ヘッダークラ​​ス:

package  
{
    import flash.utils.ByteArray;

    public class Header 
    {
        public var szID:ByteArray;
        public var bID:uint;
        public var bUnknown:uint;
        public var wDataSize:uint;
        public var dwFileSize:uint;
        public var dwNumber:uint;

        public function Header() 
        {

        }
    }
}

1090650112 _header.dwNumber(16進数では41020000)として返される/トレースされるので、ファイルの最後に到達すると想像できます。それで、私はそれを間違って読んだり、間違って使用したり、何か他のことを間違ったりしていますか?残りの

それが役に立ったら、これはAIRアプリケーションであり、私はFlex4SDKでFlashDevelopを使用しています。

4

1 に答える 1

1

これは単純なビッグ/リトルエンディアンの問題のように見えます。DWORDを構成する4バイトは、プロセッサで使用されている順序とは異なる順序でファイルに含まれています。

00000241およびその他のマルチバイト番号を取得するには、DWORDのバイトの順序を逆にする必要があります

于 2013-02-21T17:07:38.840 に答える