private void SaveTables(Stream stream, StringCoder coder) { using (var wr = new BinaryWriter(stream, Encoding.Unicode, true)) { wr.Write((Int32)Tables.Count()); foreach (var table in Tables) { wr.WriteCString(table.Name); wr.Write((Int32)table.Entries.Count()); foreach (Entry entry in table.Entries) { wr.WriteCString(entry.Key); wr.Write((Int32)entry.Hash); if (coder == null) { wr.WriteCString(entry.Text); } else { wr.Write((Int32)coder.Encode(entry.Text)); } } } } }
private void SaveNewFormat(Stream stream) { stream.Write(MAGIC, 0, MAGIC.Length); var coder = new StringCoder(); using (var memory = new MemoryStream()) { SaveTables(memory, coder); long offset = MAGIC.Length + 8 + memory.Length; for (int i = 0; i < 64; i += 8) { stream.WriteByte((byte)(offset >> i)); } memory.WriteTo(stream); } var strings = coder.GetStringTable(); using (var wr = new BinaryWriter(stream)) { wr.Write((Int32)strings.Length); foreach (var s in strings) { wr.WriteCString(s); } } }