public static Tag ReadFromStream(StreamAccessor accessor, out int tagsize) { Tag tag = new Tag(); bool unsync; int size; try{ size = tag.ReadTagHeader(accessor, out unsync); tagsize = size + 10; }catch (System.Exception e) { __dll__.log.WriteError(e, "TagHeader の読込に失敗しました。"); tagsize = 0; return(null); } System.IO.Stream str = accessor.ReadSubStream((long)size); StreamAccessor acc_str; if (unsync) { System.IO.Stream stream = ID3Utils.ID3ResolveUnsync(str); str.Close(); acc_str = new StreamAccessor(stream); } else { acc_str = new StreamAccessor(str); } if (tag.has_ext) { uint crc32; int padding; try{ tag.ReadExtHeader(acc_str, out crc32, out padding); }catch (Exception exception2) { exception = exception2; __dll__.log.WriteError(exception, "ExtendedHeader の読込に失敗しました。"); return(null); } if (tag.hascrc) { long crc_start = acc_str.Stream.Position; long crc_len = (acc_str.Stream.Length - crc_start) - padding; if (crc_len < 0L) { __dll__.log.WriteError(string.Format("Extended Header-Padding Size の値が不正です。大きすぎます:{0}", padding)); return(null); } if (crc32 != ID3Utils.CalculateCRC32(acc_str.Stream, crc_start, crc_len)) { __dll__.log.WriteError("ファイルの CRC32 値が一致しませんでした。"); return(null); } } } tag.frames = new afh.Collections.DictionaryP <string, Frame>(); while (true) { Frame val = acc_str.Read <Frame>(EncodingType.NoSpecified); if (val == Frame.EndOfFrames) { acc_str.Stream.Close(); return(tag); } tag.frames.Add(val.FrameId, val); } }