コード例 #1
0
        public StringEntry[] Import()
        {
            if (!Decompressed)
            {
                Decompress();
            }

            Header = new ScriptHeader();
            StructReader Reader = new StructReader(new MemoryStream(Script), false, Encoding);

            Reader.ReadStruct(ref Header);

            if (Header.ScriptLength + 0x10 != Script.Length)
            {
                throw new Exception("Corrupted Script");
            }

            List <StringEntry> Strings = new List <StringEntry>();

            for (uint i = 0; i < EntryCount; i++)
            {
                Reader.Seek(Header.OffsetTable + HeaderLen + (i * 4), SeekOrigin.Begin);
                uint Offset = Reader.ReadUInt32() + Header.StringTable + HeaderLen;

                Reader.Seek(Offset, SeekOrigin.Begin);
                StringEntry Entry = new StringEntry();
                Reader.ReadStruct(ref Entry);
                Strings.Add(Entry);
            }

            Reader.Close();
            return(Strings.ToArray());
        }
コード例 #2
0
        public byte[] Export(StringEntry[] Strings)
        {
            ScriptHeader NewHeader = new ScriptHeader();

            Tools.CopyStruct(Header, ref NewHeader);

            MemoryStream UnkData    = new MemoryStream();
            MemoryStream OffsetData = new MemoryStream();
            MemoryStream StringData = new MemoryStream();

            MemoryStream Reader = new MemoryStream(Script);

            Reader.Seek(0x10, SeekOrigin.Begin);

            Algo.CopyStream(Reader, UnkData, NewHeader.UnkCount * 8);
            Reader.Close();

            StructWriter OffsetWriter = new StructWriter(OffsetData, false, Encoding);
            StructWriter StringWriter = new StructWriter(StringData, false, Encoding);


            for (uint i = 0; i < EntryCount; i++)
            {
                OffsetWriter.Write((uint)StringWriter.BaseStream.Length);
                StringWriter.WriteStruct(ref Strings[i]);
            }
            OffsetWriter.Seek(0, SeekOrigin.Begin);
            StringWriter.Seek(0, SeekOrigin.Begin);

            NewHeader.ScriptLength = (uint)(OffsetWriter.BaseStream.Length + StringWriter.BaseStream.Length + UnkData.Length);
            NewHeader.OffsetTable  = (uint)UnkData.Length;
            NewHeader.StringTable  = (uint)(UnkData.Length + OffsetData.Length);

            byte[] Output = new byte[0x10 + UnkData.Length + OffsetData.Length + StringData.Length];

            Tools.BuildStruct(ref NewHeader, false, Encoding).CopyTo(Output, 0);

            UnkData.ToArray().CopyTo(Output, 0x10);
            OffsetData.ToArray().CopyTo(Output, 0x10 + UnkData.Length);
            StringData.ToArray().CopyTo(Output, 0x10 + UnkData.Length + OffsetData.Length);

            UnkData.Close();
            StringWriter.Close();
            OffsetWriter.Close();

            return(Compress(Output));
        }