【问题标题】:Reading DWORD incorrectly with AS3?使用 AS3 错误地读取 DWORD?
【发布时间】:2013-02-21 15:08:42
【问题描述】:

在this question 中,我得到了关于如何使用this information 读取 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() 
        {

        }
    }
}

问题是_header.dwNumber 返回/跟踪为 1090650112(以 16 为底的 41020000),所以我可以想象这会到达文件的末尾。那么我是读错了,用错了,还是做错了什么?其余的

如果有帮助,这是一个 AIR 应用程序,我正在使用 FlashDevelop 和 Flex 4 SDK。

【问题讨论】:

  • 这看起来像一个简单的大/小端问题,构成 DWORD 的 4 个字节在文件中的顺序与处理器使用的顺序不同。您需要颠倒 DWORD 中的字节顺序以获得 00000241,以及任何其他多字节数
  • 啊,将其切换为似乎可以解决问题的小端序。我对操作字节非常缺乏经验,所以我没有想到。有没有办法知道使用哪种字节序,还是只是猜测?
  • Endianess 通常在协议/文件规范中指定,但我从未做过,AS3、Flash 甚至不知道 BLB 文件是什么,如果它不在规范中是的,它几乎变成了吮吸一下,看看测试。
  • 既然它解决了你的问题,我已经发布了评论作为答案。

标签: actionscript-3 bytearray byte dword


【解决方案1】:

这看起来像一个简单的大/小端问题,构成 DWORD 的 4 个字节在文件中的顺序与处理器使用的顺序不同。

您需要颠倒 DWORD 中的字节顺序以获得 00000241,以及任何其他多字节数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多