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)); }
/// <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); }