【发布时间】: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