public override void Read(Tag tag, Reader reader) { header.Read(reader); tag.DescriptionMap = TagDescriptionMap.Instance[ Version.VersionByMajorMinor(header.VersionMajor, header.VersionMinor)]; if (header.size > 1) { long bytesToRead = header.size; bool invalidPadding = false; try { while (bytesToRead > 0 && reader.PeekChar() != 0 && reader.PeekChar() != -1 && !invalidPadding) { long pos0 = reader.Position; long numBytesRead = ReadFrame(tag, reader); long pos1 = reader.Position; if (numBytesRead == -1) { // Invalid but known padding (e.g. MP3e) invalidPadding = true; } bytesToRead -= (pos1 - pos0); } if (!invalidPadding && bytesToRead < 0) { throw new Exception(GetType().Name + ": Read failed"); } } catch (VersionInvariant e) { throw e; } catch (InvalidHeaderFlagsException e) { reader.HandleException(e); } catch (InvalidFrameException e) { reader.HandleException(e); } catch (NotSupportedException e) { reader.HandleException(e); } } }
private static void TestHeaderV2() { HeaderV2 header = new HeaderV2(); header.IgnoreUnsupportedFlags = true; byte[] data = { // File identificator (byte)'I', (byte)'D', (byte)'3', // Version 3, 0, // Flags 0xE0, // Size 0, 0, 0, 0 }; using (Reader reader = new Reader(data)) { header.Read(reader); header.CheckVersion(Version.v2_3); } UnitTest.Test(header.HeaderSize == 10); UnitTest.Test(header.VersionMajor == 3); UnitTest.Test(header.VersionMinor == 0); UnitTest.Test(header.IsUnsynchronized); UnitTest.Test(header.HasExtendedHeader); UnitTest.Test(header.HasExperimentalStage); using (Writer writer = new Writer()) { header.Write(writer); UnitTest.Test(ArrayUtils.IsEqual(writer.OutData, data)); } }