Beispiel #1
0
        public static id3tag read_id3tag(System.IO.Stream strm, bool createImageObject)
        {
            id3tag tag = new id3tag();

            byte[] id3_header = new byte[10];// ID3タグヘッダ用
            strm.ReadOrThrow(id3_header, 0, 10);
            id3v2header header = read_header(id3_header);

            if (header == null)
            {
                return(null);
            }
            if (header.size >= strm.Length)
            {
                return(null);
            }
            tag.head = header;

            if ((tag.head.flag & FLAG_HEAD_EXTENSION) > 0)// 拡張ヘッダがあるときサイズだけ読んでスキップ
            {
                byte[] ext_header = new byte[4];
                strm.Read(ext_header, 0, 4);
                int size;
                if (tag.head.version == 3) // v2.3
                {
                    size = ((ext_header[0] * 256 + ext_header[1]) * 256 + ext_header[2]) * 256 + ext_header[3];
                }
                else // v2.4
                {
                    size = ((ext_header[0] * 128 + ext_header[1]) * 128 + ext_header[2]) * 128 + ext_header[3] - 4;
                }
                strm.Seek(size, System.IO.SeekOrigin.Current);
            }

            /* frame */
            byte[] frame_buf = new byte[tag.head.size];
            strm.Read(frame_buf, 0, tag.head.size);


            if (((tag.head.flag & FLAG_HEAD_UNSYNC) > 0) && tag.head.version == 3)
            {
                frame_buf = DecodeUnsync(frame_buf);
            }

            MemoryStream tagBodyStream = new MemoryStream(frame_buf, 0, frame_buf.Length);
            int          count         = 0;

            while (true)
            { //offset < tag.head.size
                frame fr = read_frame(tagBodyStream, tag, createImageObject);
                if (fr == null)
                {
                    break;
                }
                count++;
                tag.frame.Add(fr);
            }
            return(tag);
        }
Beispiel #2
0
        public static id3v2header read_header(byte[] headerstr)
        {
            id3v2header header = new id3v2header();

            if (Encoding.ASCII.GetString(headerstr, 0, 3) != "ID3")
            {
                return(null);
            }

            switch ((headerstr[3] << 8) + headerstr[4])
            {
            case 0x0200:
                header.version = 2;
                if ((headerstr[5] & 0x40) > 0)
                {
                    return(null);
                }
                header.flag = headerstr[5] & 0x80;
                break;

            case 0x0300:
                header.version = 3;
                header.flag    = headerstr[5] & (0x80 + 0x40 + 0x20);
                break;

            case 0x0301:
                ;
                goto case 0x0400;

            case 0x0400:
                header.version = 4;
                header.flag    = headerstr[5] & (0x80 + 0x40 + 0x20 + 0x10);
                break;

            default:
                return(null);
            }
            header.size = (headerstr[6] << 21) + (headerstr[7] << 14) + (headerstr[8] << 7) + headerstr[9];

            return(header);
        }