Exemplo n.º 1
0
        void GetStringsfromXML(string xmlPath)
        {
            SubText sub = new SubText();
            int     say = 0;

            foreach (string line in File.ReadLines(xmlPath, Encoding.UTF8))
            {
                say++;
                if (line == "-EndFile-")
                {
                    sub            = new SubText();
                    sub.StringText = line;
                    subTexts.Add(sub);
                }
                else if (line != "" && line[line.Length - 1] == '>' && line[line.Length - 2] == '>')
                {
                    sub = new SubText();
                    string[] headPos = line.Split(new string[] { ">>" }, StringSplitOptions.RemoveEmptyEntries);
                    for (int i = 0; i < headPos.Length; i++)
                    {
                        int aa = Int32.Parse(headPos[i]);
                        sub.TopPositions.Add(aa);
                    }
                }
                else
                {
                    //yeni satırlar için /for new lines
                    string datline = line;
                    if (datline.Contains("(0D0A)"))
                    {
                        datline = line.Replace("(0D0A)", "\r\n");
                    }
                    sub.StringText = datline;
                    sub.ByteText   = Encoding.UTF8.GetBytes(datline);
                    subTexts.Add(sub);
                }
            }
        }
Exemplo n.º 2
0
        public void GetStrings(string unpackedSds)
        {
            int startPos = 498;//fixed size

            byte[]       bb     = File.ReadAllBytes(unpackedSds);
            BinaryReader binred = new BinaryReader(new MemoryStream(bb), Encoding.UTF8);

            binred.BaseStream.Position = startPos;
            List <string> allStrings = new List <string>();

            while (binred.BaseStream.Position < binred.BaseStream.Length)
            {
                binred.BaseStream.Position += 4 * 2;
                int dirLength = binred.ReadInt32();
                if (binred.BaseStream.Position + dirLength >= binred.BaseStream.Length)
                {
                    break;
                }

                binred.BaseStream.Position += dirLength;
                if (binred.ReadUInt32() != 0)
                {
                    //0 değil ise, bir dosya dizini daha var
                    binred.BaseStream.Position -= 4;
                    continue;
                }
                uint dizinBoyutu = binred.ReadUInt32();
                binred.BaseStream.Position += 66;
                int posLensCount = binred.ReadInt32();
                binred.BaseStream.Position += 8;
                long headerStartPos = binred.BaseStream.Position;
                binred.BaseStream.Position += 8;
                uint textBaslangiclari = binred.ReadUInt32();
                binred.BaseStream.Position += textBaslangiclari - 4;


                string _text   = "";
                uint   lastLoc = (uint)binred.BaseStream.Position;
                Dictionary <uint, SubText> balaba = new Dictionary <uint, SubText>();
                while (binred.ReadInt32() != 1)
                {
                    binred.BaseStream.Position -= 4;
                    byte kar = binred.ReadByte();
                    if (kar == 0x0)
                    {
                        SubText st = new SubText();
                        st.StringText = _text;
                        st.BottomPos  = lastLoc;
                        balaba.Add(lastLoc, st);
                        _text   = "";
                        lastLoc = (uint)binred.BaseStream.Position;
                    }
                    else
                    {
                        if (kar == 0x0D)
                        {
                            binred.ReadByte();
                            _text += "(0D0A)";
                        }
                        else
                        {
                            binred.BaseStream.Position -= 1;
                            _text += binred.ReadChar();
                        }
                    }
                }

                long endOfText = binred.BaseStream.Position;
                for (int i = 0; i < posLensCount; i++)
                {
                    long headPos      = headerStartPos + 16 * i;
                    long bottomLocPos = headPos + 8;
                    binred.BaseStream.Position = bottomLocPos;
                    uint bottomPos = (uint)binred.BaseStream.Position + binred.ReadUInt32();
                    balaba[bottomPos].TopPositions.Add(i);
                }

                foreach (var dman in balaba)
                {
                    SubText sub  = dman.Value;
                    string  mofo = "";
                    for (int z = 0; z < sub.TopPositions.Count; z++)
                    {
                        mofo += sub.TopPositions[z] + ">>";
                    }
                    allStrings.Add(mofo);
                    allStrings.Add(sub.StringText);
                }
                allStrings.Add("-EndFile-");
                binred.BaseStream.Position = endOfText;
            }

            binred.Close();

            string filName    = Path.GetFileNameWithoutExtension(unpackedSds) + "-Texts.xml";
            string newfileDir = Path.GetDirectoryName(unpackedSds) + "\\" + filName;

            File.WriteAllLines(newfileDir, allStrings);
        }
Exemplo n.º 3
0
        void SetStrings(string unpackedSds, string xmlPath)
        {
            BinaryReader binred  = new BinaryReader(File.Open(unpackedSds, FileMode.Open, FileAccess.Read, FileShare.Read), Encoding.UTF8);
            BinaryWriter binwrit = new BinaryWriter(File.Create(unpackedSds + ".newStrs.sds"), Encoding.UTF8);

            binwrit.Write(binred.ReadBytes(498));
            int  strIndex       = 0;
            uint dizinBoyutuPos = 0;

            while (binred.BaseStream.Position < binred.BaseStream.Length)
            {
                long startPos = binred.BaseStream.Position;
                binred.BaseStream.Position += 4 * 2;
                int dizinWordCount = binred.ReadInt32();
                if (binred.BaseStream.Position + dizinWordCount >= binred.BaseStream.Length)
                {
                    binred.BaseStream.Position = startPos;
                    while (binred.BaseStream.Position < binred.BaseStream.Length)
                    {
                        binwrit.Write(binred.ReadByte());
                    }
                    break;//son
                }

                binred.BaseStream.Position += dizinWordCount;

                if (binred.ReadUInt32() != 0)
                {
                    binred.BaseStream.Position -= 4;

                    long lastLen2 = binred.BaseStream.Position - startPos;
                    binred.BaseStream.Position = startPos;
                    binwrit.Write(binred.ReadBytes((int)lastLen2));

                    continue;
                }

                long lastLen = binred.BaseStream.Position - startPos;
                binred.BaseStream.Position = startPos;
                binwrit.Write(binred.ReadBytes((int)lastLen));

                //birust dizinin boyutunu yaz
                if (dizinBoyutuPos != 0)
                {
                    uint endPos = (uint)binwrit.BaseStream.Position - 4;
                    binwrit.BaseStream.Position = dizinBoyutuPos;
                    binwrit.Write(endPos - dizinBoyutuPos + 4);
                    binwrit.BaseStream.Position = endPos + 4;
                }

                dizinBoyutuPos = (uint)binwrit.BaseStream.Position;
                binred.ReadUInt32();
                binwrit.Write(1234);

                binwrit.Write(binred.ReadBytes(10));//10 geç

                uint dizinBoyutuPos2 = (uint)binwrit.BaseStream.Position;
                binwrit.Write(binred.ReadUInt32());

                binwrit.Write(binred.ReadBytes(12 + 12));//24geç

                uint textSonuPos = (uint)binwrit.BaseStream.Position;
                binred.ReadUInt32();
                binwrit.Write(1234);

                binwrit.Write(binred.ReadBytes(24));     //36geç
                uint posLensSize  = binred.ReadUInt32(); // multp by 16
                uint posLensSize2 = binred.ReadUInt32(); //multp by 16
                binwrit.Write(posLensSize);
                binwrit.Write(posLensSize2);
                binwrit.Write(binred.ReadBytes(4));

                long headerPos    = binwrit.BaseStream.Position;
                long redHeaderPos = binred.BaseStream.Position;
                binwrit.Write(binred.ReadBytes((int)(posLensSize * 16)));
                binred.BaseStream.Position -= 8;
                binred.BaseStream.Position += binred.ReadUInt32() - 4;
                while (binred.ReadByte() != 1)
                {
                    ;
                }
                binred.BaseStream.Position += 3;
                //text posları yazdı, şu an textleri yazma posda

                while (subTexts[strIndex].StringText != "-EndFile-")
                {
                    SubText sub = subTexts[strIndex];
                    sub.BottomPos = (uint)binwrit.BaseStream.Position;
                    binwrit.Write(sub.ByteText);
                    binwrit.Write((byte)0x0);
                    long tut = binwrit.BaseStream.Position;
                    for (int z = 0; z < sub.TopPositions.Count; z++)
                    {
                        binwrit.BaseStream.Position = headerPos + (16 * sub.TopPositions[z]) + 8;
                        uint toppos = (uint)(sub.BottomPos - binwrit.BaseStream.Position);
                        binwrit.Write(toppos);
                    }
                    binwrit.BaseStream.Position = tut;
                    strIndex++;
                }
                //texsonuposu yazdır
                uint lastPo = (uint)binwrit.BaseStream.Position;
                binwrit.BaseStream.Position = textSonuPos;
                binwrit.Write(lastPo - textSonuPos - 4);
                binwrit.BaseStream.Position = lastPo;

                binwrit.Write((uint)1);
                strIndex++;
            }

            if (dizinBoyutuPos != 0)
            {
                uint endPos = (uint)binwrit.BaseStream.Position;
                binwrit.BaseStream.Position = dizinBoyutuPos;
                binwrit.Write(endPos - dizinBoyutuPos + 4);
                binwrit.BaseStream.Position = endPos + 4;
            }
            binred.Close();
            binwrit.Close();

            File.Delete(unpackedSds);
            File.Move(unpackedSds + ".newStrs.sds", unpackedSds);
        }