2013-02-14 2 views
0

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

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

ответ

3

Это довольно просто, используя методы IDataInput - вы можете напрямую прочитать FileStream или Socket или обработать ByteArray. Adobe имеет an example for ZIP files, что по сути совпадает с вашим вариантом использования. Вам нужно знать, сколько байтов занимает каждый член структуры (т. Е. 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 быть String, вместо этого, вы можете использовать

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), ... 
+0

Спасибо, это выглядит так же, как Что мне нужно. Дело в том, что у меня нет опыта в том, чтобы делать подобные вещи на любом языке, и хотя я думаю, что понимаю некоторые части, я немного смущен другим. Если бы вы узнали учебник о том, что в общих чертах о чтении байтов (и тому подобное, как signed/unsigned, little/big endian и т. Д.), Это, вероятно, поможет мне. Кроме того, как IDataInput знает, что читать? Сохраняет ли он текущую позицию смещения или что-то еще? – puggsoy

+0

Как работает IDataInput, зависит от реализации - ByteArray использует смещение, FileStream - расходный поток. –

+0

Ну, я нашел руководство, в котором объясняется, как манипулировать и использовать байты немного больше, поэтому я думаю, что вашего ответа достаточно, чтобы начать меня. В любом случае вы ответили на мой вопрос, поэтому я теперь отметил его как принимаемый :) – puggsoy