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); } } }
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); }
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); }