예제 #1
0
        /// <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
            });
        }
예제 #2
0
 //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;
 }