public static async Task <Tag> FromStream(Stream stream, int tagLength) { var newTag = new Tag(); while (stream.Position < tagLength && stream.ReadByte() != 0x00) { stream.Seek(-1, SeekOrigin.Current); Frame23Header frameHeader = Frame23Header.FromStream(stream); Frame tag = GetFrame(frameHeader.Id); if (tag != null) { await tag.FromStreamAsync(stream, frameHeader.Size, TagVersion.V23).ConfigureAwait(false); newTag.Frames.Add(tag); } else { Debug.WriteLine($"Unable to read {frameHeader.Id} tag. Skipping it."); stream.Seek(frameHeader.Size, SeekOrigin.Current); } } return(newTag); }
public static Frame23Header FromStream(Stream stream) { var frameHeader = ArrayPool <byte> .Shared.Rent(10); stream.Read(frameHeader, 0, 10); var header = new Frame23Header(); header.Id = frameHeader.ReadUInt32(0); header.Size = frameHeader.ReadUInt32(4); header.TagAlterPreservation = ((frameHeader[8] & 0x80) == 0x80); header.FileAlterPreservation = ((frameHeader[8] & 0x40) == 0x40); header.ReadOnly = ((frameHeader[8] & 0x10) == 0x10); header.Compression = ((frameHeader[9] & 0x80) == 0x80); header.Encryption = ((frameHeader[9] & 0x40) == 0x40); header.GroupingIdentity = ((frameHeader[9] & 0x20) == 0x20); ArrayPool <byte> .Shared.Return(frameHeader); return(header); }