AS3 - Использование структурной информации для распаковки формата

Мне интересно, можно ли использовать такую информацию в AS3 для распаковки формата? Я видел, как люди используют C++ для распаковки похожих форматов, но, поскольку я свободно владею AS3, я хотел бы знать, могу ли я использовать свои знания ActionScript, чтобы делать то же самое.

Это может быть очевидно, но я мало работал с ByteArrays и довольно неопытен в манипулировании байтами. Я готов учиться все же.

1 ответ

Решение

Это довольно просто, используя 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), ...
Другие вопросы по тегам