public FinderInfo(FileStream fr) { var br = new BinaryReader(fr); fr.Position += 34;// Finder Info ヘッダ本体?(読み飛ばし) if (!br.ReadBytes(4).SequenceEqual(new byte[] { (byte)'A', (byte)'T', (byte)'T', (byte)'R' })) { throw new ArgumentException(); } br.ReadInt32();// debug_tag Length = FromBE(br.ReadUInt32()); var data_start = FromBE(br.ReadUInt32()); var data_length = FromBE(br.ReadUInt32()); fr.Position += 12; var flag = FromBE(br.ReadUInt16()); var attrCount = FromBE(br.ReadUInt16()); var attrHeaders = new List <AttrHeader>(); for (uint i = 0; i < attrCount; ++i) { var header = new AttrHeader(); header.offset = FromBE(br.ReadUInt32()); header.length = FromBE(br.ReadUInt32()); br.ReadUInt16(); //flags var namelen = br.ReadByte(); header.name = Encoding.UTF8.GetString(br.ReadBytes(namelen - 1)); // 0終端 if (br.ReadByte() != 0) { throw new ArgumentException(); } fr.Position += 3 - ((11 + namelen + 3) % 4); attrHeaders.Add(header); } foreach (var header in attrHeaders) { fr.Seek(header.offset, SeekOrigin.Begin); Attrs.Add(new Attr(header.name, br.ReadBytes((int)header.length))); } }
public FinderInfo(FileStream fr) { var br = new BinaryReader(fr); fr.Position += 34;// Finder Info ヘッダ本体?(読み飛ばし) if (!br.ReadBytes(4).SequenceEqual(new byte[] { (byte)'A', (byte)'T', (byte)'T', (byte)'R' })) throw new ArgumentException(); br.ReadInt32();// debug_tag Length = FromBE(br.ReadUInt32()); var data_start = FromBE(br.ReadUInt32()); var data_length = FromBE(br.ReadUInt32()); fr.Position += 12; var flag = FromBE(br.ReadUInt16()); var attrCount = FromBE(br.ReadUInt16()); var attrHeaders = new List<AttrHeader>(); for (uint i = 0; i < attrCount; ++i) { var header = new AttrHeader(); header.offset = FromBE(br.ReadUInt32()); header.length = FromBE(br.ReadUInt32()); br.ReadUInt16();//flags var namelen = br.ReadByte(); header.name = Encoding.UTF8.GetString(br.ReadBytes(namelen - 1));// 0終端 if (br.ReadByte() != 0) throw new ArgumentException(); fr.Position += 3 - ((11 + namelen + 3) % 4); attrHeaders.Add(header); } foreach(var header in attrHeaders) { fr.Seek(header.offset, SeekOrigin.Begin); Attrs.Add(new Attr(header.name, br.ReadBytes((int)header.length))); } }