コード例 #1
0
ファイル: IPAC.cs プロジェクト: psyouloveme/ShenmueDKSharp
        protected override void _Read(BinaryReader reader)
        {
            long baseOffset = reader.BaseStream.Position;

            //Read header
            Signature = reader.ReadUInt32();
            if (!IsValid(Signature))
            {
                throw new InvalidFileSignatureException();
            }

            DictionaryOffset = reader.ReadUInt32();
            FileCount        = reader.ReadUInt32();
            ContentSize      = reader.ReadUInt32();
            Entries.Clear();

            //Read the table of content
            reader.BaseStream.Seek(baseOffset + DictionaryOffset, SeekOrigin.Begin);
            for (int i = 0; i < FileCount; i++)
            {
                IPACEntry entry = new IPACEntry();
                entry.Read(reader);
                entry.Index = (uint)i;
                Entries.Add(entry);
            }

            //Read the data to the buffer of the table of content entries
            foreach (IPACEntry entry in Entries)
            {
                reader.BaseStream.Seek(baseOffset + entry.Offset, SeekOrigin.Begin);
                entry.Buffer = reader.ReadBytes((int)entry.FileSize);
            }
        }
コード例 #2
0
ファイル: IPAC.cs プロジェクト: psyouloveme/ShenmueDKSharp
 /// <summary>
 /// Packs the given files into the IPAC object.
 /// The input files must have the same format as the unpack method
 /// or the file entries have to be added manually.
 /// </summary>
 public void Pack(List <string> filepaths)
 {
     Entries.Clear();
     foreach (string filepath in filepaths)
     {
         IPACEntry entry = new IPACEntry();
         entry.Extension = Path.GetExtension(filepath).Substring(1, 4).ToUpper();
         entry.Filename  = Path.GetFileNameWithoutExtension(filepath).ToUpper();
         using (FileStream stream = new FileStream(filepath, FileMode.Open))
         {
             entry.FileSize = (uint)stream.Length;
             entry.Buffer   = new byte[stream.Length];
             stream.Read(entry.Buffer, 0, entry.Buffer.Length);
         }
         Entries.Add(entry);
     }
 }
コード例 #3
0
ファイル: IPAC.cs プロジェクト: psyouloveme/ShenmueDKSharp
        protected override void _Write(BinaryWriter writer)
        {
            long baseOffset = writer.BaseStream.Length;

            FileCount = (uint)Entries.Count;

            //Calculate offsets
            uint offset = 16;

            foreach (IPACEntry entry in Entries)
            {
                entry.Offset = offset;
                offset      += entry.FileSize;
                offset      += 16 - (offset % 16);
                offset      += 16; //16 byte padding
            }
            ContentSize      = offset;
            DictionaryOffset = ContentSize;

            //Write header
            writer.Write(Signature);
            writer.Write(DictionaryOffset);
            writer.Write(FileCount);
            writer.Write(ContentSize);

            //Write the data of the table of content files
            foreach (IPACEntry entry in Entries)
            {
                writer.BaseStream.Seek(baseOffset + entry.Offset, SeekOrigin.Begin);
                writer.Write(entry.Buffer);
            }

            //Write table of contents
            writer.BaseStream.Seek(baseOffset + DictionaryOffset, SeekOrigin.Begin);
            for (int i = 0; i < Entries.Count; i++)
            {
                IPACEntry entry = Entries[i];
                entry.Index = (uint)i;
                entry.Write(writer);
            }
        }