Beispiel #1
0
        public TOCBlock(byte[] buffer)
        {
            if (buffer.Length > Length)
            {
                // Checksum only applies to the first 512 bytes (even when the sector size > 512 bytes)
                buffer = ByteReader.ReadBytes(buffer, 0, 512);
            }
            Signature = ByteReader.ReadAnsiString(buffer, 0x00, 8);
            uint checksum = BigEndianConverter.ToUInt32(buffer, 0x08);

            UpdateSequenceNumber = BigEndianConverter.ToUInt64(buffer, 0x0C);
            // 16 zeros
            int offset = 0x24;

            // If the first character is not null (0x00), then there is a region defined
            while (buffer[offset] != 0)
            {
                TOCRegion region = new TOCRegion(buffer, offset);
                Regions.Add(region);
                offset += TOCRegion.Length;
            }

            BigEndianWriter.WriteUInt32(buffer, 0x08, (uint)0); // we exclude the checksum field from checksum calculations
            m_isChecksumValid = (checksum == PrivateHeader.CalculateChecksum(buffer));
        }
Beispiel #2
0
        /// <summary>
        /// TOC Block may need to be padded with zeros in order to fill an entire sector
        /// </summary>
        public byte[] GetBytes()
        {
            byte[] buffer = new byte[Length];
            ByteWriter.WriteAnsiString(buffer, 0x00, Signature, 8);
            // we'll write checksum later
            BigEndianWriter.WriteUInt64(buffer, 0x0C, UpdateSequenceNumber);
            int offset = 0x24;

            foreach (TOCRegion region in Regions)
            {
                region.WriteBytes(buffer, offset);
                offset += TOCRegion.Length;
            }

            uint checksum = PrivateHeader.CalculateChecksum(buffer);

            BigEndianWriter.WriteUInt32(buffer, 0x08, checksum);
            return(buffer);
        }