Beispiel #1
0
            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)));
                }
            }
Beispiel #2
0
 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)));
     }
 }