/// <summary> /// ID3V2フレームヘッダを解析 /// </summary> /// <param name="buffer"></param> /// <param name="version"></param> /// <returns></returns> private static Frame readFrameHeader(byte[] buffer, ID3V2_VER version) { if (buffer[0] == 0) { throw new EndOfTagException(); } FrameID fid; int size; FRAME_FLAG flag = 0; switch (version) { case ID3V2_VER.ID3V22: fid = FRAMES.FirstOrDefault(_ => _.Name2 == Encoding.ASCII.GetString(buffer, 0, 3)); size = (int)ReadUInt24(buffer, 3); break; case ID3V2_VER.ID3V23: fid = FRAMES.FirstOrDefault(_ => _.Name3 == Encoding.ASCII.GetString(buffer, 0, 4)); size = (int)ReadUInt32(buffer, 4); flag = (FRAME_FLAG)(((uint)buffer[8] << 7) + (((uint)buffer[9] >> 4) & 0x0F) + (((uint)buffer[9] << 1) & 0x40)); break; case ID3V2_VER.ID3V24: fid = FRAMES.FirstOrDefault(_ => _.Name4 == Encoding.ASCII.GetString(buffer, 0, 4)); size = (int)ReadUInt28(buffer, 4); flag = (FRAME_FLAG)(((uint)buffer[8] << 8) + buffer[9]); break; default: throw new ArgumentOutOfRangeException(); } return(new Frame() { ID = fid, Size = size, Flag = flag }); }
//public readonly ID3V2Ver Ver; public FrameID(string name2, string name3, string name4, string asApe, string desc, FRAME_TYPE type, ID3V2_VER ver) { this.Name2 = name2; this.Name3 = name3; this.Name4 = name4; this.AsApe = asApe; this.Desc = desc; this.Type = type; //this.Ver = ver; }