我想知道,是否可以在 AS3 中使用这种信息来解压缩格式?我见过人们使用 C++ 来解压缩类似的格式,但由于我精通 AS3,我想知道是否可以使用我的 ActionScript 知识来做同样的事情。
这可能很明显,但我对 ByteArrays 的工作并不多,而且对操纵字节也很缺乏经验。不过我愿意学习。
我想知道,是否可以在 AS3 中使用这种信息来解压缩格式?我见过人们使用 C++ 来解压缩类似的格式,但由于我精通 AS3,我想知道是否可以使用我的 ActionScript 知识来做同样的事情。
这可能很明显,但我对 ByteArrays 的工作并不多,而且对操纵字节也很缺乏经验。不过我愿意学习。
这使用方法非常简单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), ...