Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }