public TagData ExtractTag(Stream stream, TagInstance tag)
{
if (tag == null)
throw new ArgumentNullException(nameof(tag));
if (tag.HeaderOffset < 0)
throw new ArgumentException("The tag is not in the cache file");
// Build the description info and get the data offset
uint dataOffset;
var data = BuildTagDescription(stream, tag, out dataOffset);
// Read the tag data
stream.Position = tag.HeaderOffset + dataOffset;
data.Data = new byte[tag.TotalSize - dataOffset];
stream.Read(data.Data, 0, data.Data.Length);
// Correct pointers
using (var dataWriter = new BinaryWriter(new MemoryStream(data.Data)))
{
foreach (var fixup in data.PointerFixups)
{
dataWriter.BaseStream.Position = fixup.WriteOffset;
dataWriter.Write(tag.OffsetToPointer(fixup.TargetOffset));
}
}
return data;
}