В this question Я получил ответ о том, как использовать this information для чтения BLB-файлов. Поэтому я выполнил инструкции, и кажется, что я правильно читаю заголовок.Чтение DWORD неправильно с AS3?
Однако, когда я пытаюсь прочитать идентификаторы файлов, я получаю конец ошибки во время выполнения файла:
[Fault] exception, information=Error: Error #2030: End of file was encountered.
Вот мой код.
Базовый класс: класс
package
{
import flash.display.Sprite;
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.utils.ByteArray;
import flash.utils.IDataInput;
import flash.filesystem.FileMode;
public class BLBDecompress extends Sprite
{
private var _file:File;
private var _stream:FileStream;
private var _blbBytes:ByteArray;
private var _header:Header;
private var _fileIDs:Array;
public function BLBDecompress()
{
decompress();
}
private function decompress():void
{
_file = File.applicationDirectory.resolvePath("testfiles/t.blb");
_blbBytes = new ByteArray();
_stream = new FileStream();
_stream.open(_file, FileMode.READ);
_stream.readBytes(_blbBytes);
_stream.close();
_header = readHeader(_blbBytes);
_fileIDs = new Array();
for (var i:int = 0; i < _header.dwNumber; i++)
{
_fileIDs.push(readFileID(_blbBytes));
}
}
private function readHeader(input:IDataInput):Header
{
var header:Header = new Header();
header.szID = new ByteArray();
input.readBytes(header.szID, 0, 4);
header.bID = input.readUnsignedByte();
header.bUnknown = input.readUnsignedByte();
header.wDataSize = input.readUnsignedShort();
header.dwFileSize = input.readUnsignedInt();
header.dwNumber = input.readUnsignedInt();
return header;
}
private function readFileID(input:IDataInput):uint
{
var fileID:uint = input.readUnsignedInt();
return fileID;
}
}
}
Заголовок:
package
{
import flash.utils.ByteArray;
public class Header
{
public var szID:ByteArray;
public var bID:uint;
public var bUnknown:uint;
public var wDataSize:uint;
public var dwFileSize:uint;
public var dwNumber:uint;
public function Header()
{
}
}
}
Дело в том, что _header.dwNumber
возвращает/следы, как 1090650112 (41020000 в базе 16), так что я могу себе представить, что бы дойти до конца файла. Так я читаю его неправильно, используя его неправильно или что-то не так? Остальная часть
Если это помогает, это приложение AIR, и я использую FlashDevelop с SDK Flex 4.
Это выглядит как простые Большими/Маленькими проблемы с обратным порядком байт, 4 байта, которые составляют DWORD находятся в файл в порядке differnet, который используется вашим процессором. Вам нужно отменить порядок байтов в DWORD, чтобы получить 00000241, и любой другой многобайтовый номер – Dampsquid
Ах, переключая его на маленький конец, что, кажется, исправить. Я довольно неопытен, манипулируя байтами, поэтому это не перешло мне в голову. Есть ли способ узнать, какую консистенцию использовать, или это просто догадки? – puggsoy
Endianess обычно указывается в спецификации протокола/файла, но я никогда не делал этого и AS3, Flash или даже не знал, что такое BLB-файл, если его нет в спецификации, он в значительной степени становится suckit и видит тест. – Dampsquid