0

我想知道,是否可以在 AS3 中使用这种信息来解压缩格式?我见过人们使用 C++ 来解压缩类似的格式,但由于我精通 AS3,我想知道是否可以使用我的 ActionScript 知识来做同样的事情。

这可能很明显,但我对 ByteArrays 的工作并不多,而且对操纵字节也很缺乏经验。不过我愿意学习。

4

1 回答 1

3

这使用方法非常简单IDataInput——您可以直接从 FileStream 或 Socket 中读取,也可以处理 ByteArray。Adobe 有一个 ZIP 文件示例,与您的用例基本相同。您确实需要知道该结构的每个成员占用了多少字节(即,DWORD 通常是 32 位无符号位)。

对于您的示例:

struct BLBHeader                    class Header 
{                                   {    
    char    szID[4];                    public var szID:ByteArray;
    BYTE    bID;                        public var bID:uint;
    BYTE    bUnknown;                   public var bUnknwon:uint;
    WORD    wDataSize;                  public var wDataSize:uint;
    DWORD dwFileSize;                   public var dwFileSize:uint;
    DWORD dwNumber;                     public var dwNumber:uint;
};                                  }

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

    // ByteArrays have to be pre-allocated
    header.szID      = new ByteArray();
    input.readBytes(header.szID, 0, 4);

    // primitives just get read in
    header.bID       = input.readUnsignedByte();  // 8 bits
    header.bUnknown  = input.readUnsignedByte();
    header.wDataSize = input.readUnsignedShort(); // 16 bits
    DWORD dwFileSize = input.readUnsignedInt();   // 32 bits
    DWORD dwNumber   = input.readUnsignedInt(); 
};

如果您希望 szID 改为字符串,则可以使用

header.szID = input.readMultiByte(4, 'us-ascii'); // one byte per char

要使用:

var header:Header = readHeader(input);
var fileIDs:Array = [];
for (var i:int = 0; i < header.dwNumber; ++i) {
    fileIDs.push( readFileID(input) );
}
... // continue with readDirEntry(input), readDataSection(input), ...
于 2013-02-14T16:52:54.700 回答