2013-02-21 1 views
0

В 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.

+1

Это выглядит как простые Большими/Маленькими проблемы с обратным порядком байт, 4 байта, которые составляют DWORD находятся в файл в порядке differnet, который используется вашим процессором. Вам нужно отменить порядок байтов в DWORD, чтобы получить 00000241, и любой другой многобайтовый номер – Dampsquid

+0

Ах, переключая его на маленький конец, что, кажется, исправить. Я довольно неопытен, манипулируя байтами, поэтому это не перешло мне в голову. Есть ли способ узнать, какую консистенцию использовать, или это просто догадки? – puggsoy

+1

Endianess обычно указывается в спецификации протокола/файла, но я никогда не делал этого и AS3, Flash или даже не знал, что такое BLB-файл, если его нет в спецификации, он в значительной степени становится suckit и видит тест. – Dampsquid

ответ

1

Это похоже на простую проблему Большого/Маленького конца, 4 байта, которые составляют DWORD, находятся в файле в другом порядке, который используется вашим процессором.

Вы должны изменить порядок байт в DWORD, чтобы получить 00000241, а также любой другой многобайтовый номер

+0

Спасибо, решена проблема! – puggsoy

Смежные вопросы