public void ParseISO9660(Stream s) { long startPosition = s.Position; byte[] buffer = new byte[ISOFile.SECTOR_SIZE]; s.Position = startPosition - ISOFile.SECTOR_SIZE; // Read the entire structure s.Read(buffer, 0, ISOFile.SECTOR_SIZE); // Get the type this.Type = buffer[0]; // Handle the primary volume information if (this.Type == 1) { int cursor = 8; // Get the system identifier Array.Copy(buffer, cursor, this.SystemIdentifier, 0, LENGTH_SHORT_IDENTIFIER); cursor += LENGTH_SHORT_IDENTIFIER; // Get the volume identifier Array.Copy(buffer, cursor, this.VolumeIdentifier, 0, LENGTH_SHORT_IDENTIFIER); cursor += LENGTH_SHORT_IDENTIFIER; cursor += 8; // Get the total number of sectors this.NumberOfSectors = bc.ToInt32(buffer, cursor); cursor += 8; cursor += 32; this.VolumeSetSize = bc.ToInt16(buffer, cursor); cursor += 4; this.VolumeSequenceNumber = bc.ToInt16(buffer, cursor); cursor += 4; this.SectorSize = bc.ToInt16(buffer, cursor); cursor += 4; this.PathTableSize = bc.ToInt32(buffer, cursor); cursor += 8; this.OffsetOfFirstLittleEndianPathTable = bc.ToInt32(buffer, cursor); cursor += 4; this.OffsetOfSecondLittleEndianPathTable = bc.ToInt32(buffer, cursor); cursor += 4; this.OffsetOfFirstLittleEndianPathTable = bcBig.ToInt32(buffer, cursor); cursor += 4; this.OffsetOfSecondLittleEndianPathTable = bcBig.ToInt32(buffer, cursor); cursor += 4; this.RootDirectoryRecord.Parse(buffer, cursor); cursor += LENGTH_ROOT_DIRECTORY_RECORD; Array.Copy(buffer, cursor, this.VolumeSetIdentifier, 0, LENGTH_LONG_IDENTIFIER); cursor += LENGTH_LONG_IDENTIFIER; Array.Copy(buffer, cursor, this.PublisherIdentifier, 0, LENGTH_LONG_IDENTIFIER); cursor += LENGTH_LONG_IDENTIFIER; Array.Copy(buffer, cursor, this.DataPreparerIdentifier, 0, LENGTH_LONG_IDENTIFIER); cursor += LENGTH_LONG_IDENTIFIER; Array.Copy(buffer, cursor, this.ApplicationIdentifier, 0, LENGTH_LONG_IDENTIFIER); cursor += LENGTH_LONG_IDENTIFIER; Array.Copy(buffer, cursor, this.CopyrightFileIdentifier, 0, LENGTH_IDENTIFIER); cursor += LENGTH_IDENTIFIER; Array.Copy(buffer, cursor, this.AbstractFileIdentifier, 0, LENGTH_IDENTIFIER); cursor += LENGTH_IDENTIFIER; Array.Copy(buffer, cursor, this.BibliographicalFileIdentifier, 0, LENGTH_IDENTIFIER); cursor += LENGTH_IDENTIFIER; Array.Copy(buffer, cursor, this.VolumeCreationDateTime, 0, LENGTH_TIME); cursor += LENGTH_TIME; Array.Copy(buffer, cursor, this.LastModifiedDateTime, 0, LENGTH_TIME); cursor += LENGTH_TIME; Array.Copy(buffer, cursor, this.ExpirationDateTime, 0, LENGTH_TIME); cursor += LENGTH_TIME; Array.Copy(buffer, cursor, this.EffectiveDateTime, 0, LENGTH_TIME); cursor += LENGTH_TIME; cursor += 1; cursor += 1; Array.Copy(buffer, cursor, this.Reserved, 0, LENGTH_RESERVED); cursor += LENGTH_RESERVED; } }
/// <summary> /// Parse the node record from the given stream. /// </summary> /// <param name="s">The stream to parse from.</param> public void Parse(Stream s) { EndianBitConverter bc = EndianBitConverter.CreateForLittleEndian(); long startPosition = s.Position; byte[] buffer = new byte[ISOFile.SECTOR_SIZE]; // Get the length s.Read(buffer, 0, 1); this.Length = buffer[0]; // "CD001" + 0x01 s.Read(buffer, 0, 1); // Read Data Offset s.Read(buffer, 0, 8); this.OffsetOfData = (long)bc.ToInt32(buffer); // Read Data Length s.Read(buffer, 0, 8); this.LengthOfData = (long)bc.ToInt32(buffer); // Read the time and flags s.Read(buffer, 0, 8); this.Year = buffer[0]; this.Month = buffer[1]; this.Day = buffer[2]; this.Hour = buffer[3]; this.Minute = buffer[4]; this.Second = buffer[5]; this.TimeZoneOffset = buffer[6]; this.Flags = buffer[7]; s.Read(buffer, 0, 6); // Read the name length s.Read(buffer, 0, 1); this.NameLength = buffer[0]; // Read the directory name s.Read(buffer, 0, this.NameLength); if (this.NameLength == 1 && (buffer[0] == 0 || buffer[0] == 1)) { if (buffer[0] == 0) { this.Name = ISONodeRecord.CURRENT_DIRECTORY; } else { this.Name = ISONodeRecord.PARENT_DIRECTORY; } } else { this.Name = ASCIIEncoding.ASCII.GetString(buffer, 0, this.NameLength); } // Seek to end s.Seek(startPosition + this.Length, SeekOrigin.Begin); }