Это довольно просто, используя методы 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), ...
Спасибо, это выглядит так же, как Что мне нужно. Дело в том, что у меня нет опыта в том, чтобы делать подобные вещи на любом языке, и хотя я думаю, что понимаю некоторые части, я немного смущен другим. Если бы вы узнали учебник о том, что в общих чертах о чтении байтов (и тому подобное, как signed/unsigned, little/big endian и т. Д.), Это, вероятно, поможет мне. Кроме того, как IDataInput знает, что читать? Сохраняет ли он текущую позицию смещения или что-то еще? – puggsoy
Как работает IDataInput, зависит от реализации - ByteArray использует смещение, FileStream - расходный поток. –
Ну, я нашел руководство, в котором объясняется, как манипулировать и использовать байты немного больше, поэтому я думаю, что вашего ответа достаточно, чтобы начать меня. В любом случае вы ответили на мой вопрос, поэтому я теперь отметил его как принимаемый :) – puggsoy