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); }
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); }