byte[] rebuildSubsBlock(List<SubtitleEntry> entries, int blockNumber) { MemoryStream mem = new MemoryStream(); BinaryWriter br = new BinaryWriter(mem); mem.Position += 4; foreach (SubtitleEntry e in entries) { if (e.blockNumber != blockNumber) continue; var langNumber = ((int)e.lang).ToString().ToCharArray(); br.Write(langNumber, 0, langNumber.Length); br.Write('\r'); br.Write(Encoding.UTF8.GetBytes(e.text)); br.Write('\r'); } mem.Position = 0; mem.writeuint((uint)(mem.Length - 4), isBE); return mem.ToArray(); }
private byte[] blockChangeSub(byte[] array, SubtitleEntry entry, int blockno) { int index = array.Length - 1; byte[] output = null; // Remove end zeros while (index >= 0 && array[index] == 0x00) { index--; } int endidx = index; int startidx = findSubsStartIndex(array, endidx); if (startidx == 0) throw new Exception("Error finding sub to replace"); // Read original subs List<SubtitleEntry> origSubs = new List<SubtitleEntry>(); parseSubsBlock(origSubs, Encoding.UTF8.GetString(array, startidx + 4, endidx - startidx - 4), blockno); // Replace new subtitle text foreach (SubtitleEntry newEntry in subEntries) { if (newEntry.blockNumber != blockno) continue; foreach (SubtitleEntry origEntry in origSubs) { if (newEntry.lang == origEntry.lang) { origEntry.text = newEntry.text; break; } } } // Get the modified subs block var subs = rebuildSubsBlock(origSubs, blockno); //origSubs being the new subs // Compute total length int length = startidx + subs.Length; // Align to 16 bytes length = ((length + 15) >> 4) << 4; output = new byte[length]; // Copy data before subs Array.Copy(array, output, startidx); // Copy subs Array.Copy(subs, 0, output, startidx, subs.Length); // Adjust lengths MemoryStream ms = new MemoryStream(output); ms.Position = 4; ms.writeuint((uint)(length - 16), isBE); if (blockno != 0) { ms.Position = 16; ms.writeuint((uint)(length - 20), isBE); } return output; }