diff --git a/SabreTools.Library/External/CHDFile.cs b/SabreTools.Library/External/CHDFile.cs
index e01a9910..792da2c7 100644
--- a/SabreTools.Library/External/CHDFile.cs
+++ b/SabreTools.Library/External/CHDFile.cs
@@ -132,10 +132,8 @@ namespace SabreTools.Library.External
}
// Get the header size and version
- byte[] headersizebytes = m_br.ReadBytes(4).Reverse().ToArray();
- m_headersize = BitConverter.ToUInt32(headersizebytes, 0);
- byte[] versionbytes = m_br.ReadBytes(4).Reverse().ToArray();
- m_version = BitConverter.ToUInt32(versionbytes, 0);
+ m_headersize = ReadUInt32();
+ m_version = ReadUInt32();
// If we have an invalid combination of size and version
if ((m_version == 3 && m_headersize != Constants.CHD_V3_HEADER_SIZE)
@@ -190,7 +188,7 @@ namespace SabreTools.Library.External
private byte[] ParseCHDv3Header()
{
// Seek to after the signature to make sure we're reading the correct bytes
- m_br.BaseStream.Seek(8, SeekOrigin.Begin);
+ m_br.BaseStream.Seek(16, SeekOrigin.Begin);
// Set the blank SHA-1 hash
byte[] sha1 = new byte[20];
@@ -200,7 +198,7 @@ namespace SabreTools.Library.External
m_mapentrybytes = 16;
// Read the CHD flags
- uint flags = m_br.ReadUInt32();
+ uint flags = ReadUInt32();
// Determine compression
switch (m_br.ReadUInt32())
@@ -214,12 +212,12 @@ namespace SabreTools.Library.External
m_compression[1] = m_compression[2] = m_compression[3] = CHDCodecType.CHD_CODEC_NONE;
- m_hunkcount = m_br.ReadUInt32();
- m_logicalbytes = m_br.ReadUInt64();
- m_metaoffset = m_br.ReadUInt64();
+ m_hunkcount = ReadUInt32();
+ m_logicalbytes = ReadUInt64();
+ m_metaoffset = ReadUInt32();
m_br.BaseStream.Seek(76, SeekOrigin.Begin);
- m_hunkbytes = m_br.ReadUInt32();
+ m_hunkbytes = ReadUInt32();
m_br.BaseStream.Seek(Constants.CHDv3SHA1Offset, SeekOrigin.Begin);
sha1 = m_br.ReadBytes(20);
@@ -238,7 +236,7 @@ namespace SabreTools.Library.External
private byte[] ParseCHDv4Header()
{
// Seek to after the signature to make sure we're reading the correct bytes
- m_br.BaseStream.Seek(8, SeekOrigin.Begin);
+ m_br.BaseStream.Seek(16, SeekOrigin.Begin);
// Set the blank SHA-1 hash
byte[] sha1 = new byte[20];
@@ -248,7 +246,7 @@ namespace SabreTools.Library.External
m_mapentrybytes = 16;
// Read the CHD flags
- uint flags = m_br.ReadUInt32();
+ uint flags = ReadUInt32();
// Determine compression
switch (m_br.ReadUInt32())
@@ -262,12 +260,12 @@ namespace SabreTools.Library.External
m_compression[1] = m_compression[2] = m_compression[3] = CHDCodecType.CHD_CODEC_NONE;
- m_hunkcount = m_br.ReadUInt32();
- m_logicalbytes = m_br.ReadUInt64();
- m_metaoffset = m_br.ReadUInt64();
+ m_hunkcount = ReadUInt32();
+ m_logicalbytes = ReadUInt64();
+ m_metaoffset = ReadUInt32();
m_br.BaseStream.Seek(44, SeekOrigin.Begin);
- m_hunkbytes = m_br.ReadUInt32();
+ m_hunkbytes = ReadUInt32();
m_br.BaseStream.Seek(Constants.CHDv4SHA1Offset, SeekOrigin.Begin);
sha1 = m_br.ReadBytes(20);
@@ -285,23 +283,23 @@ namespace SabreTools.Library.External
private byte[] ParseCHDv5Header()
{
// Seek to after the signature to make sure we're reading the correct bytes
- m_br.BaseStream.Seek(8, SeekOrigin.Begin);
+ m_br.BaseStream.Seek(16, SeekOrigin.Begin);
// Set the blank SHA-1 hash
byte[] sha1 = new byte[20];
// Determine compression
- m_compression[0] = (CHDCodecType)m_br.ReadUInt32();
- m_compression[1] = (CHDCodecType)m_br.ReadUInt32();
- m_compression[2] = (CHDCodecType)m_br.ReadUInt32();
- m_compression[3] = (CHDCodecType)m_br.ReadUInt32();
+ m_compression[0] = (CHDCodecType)ReadUInt32();
+ m_compression[1] = (CHDCodecType)ReadUInt32();
+ m_compression[2] = (CHDCodecType)ReadUInt32();
+ m_compression[3] = (CHDCodecType)ReadUInt32();
- m_logicalbytes = m_br.ReadUInt64();
- m_mapoffset = m_br.ReadUInt64();
- m_metaoffset = m_br.ReadUInt64();
- m_hunkbytes = m_br.ReadUInt32();
+ m_logicalbytes = ReadUInt64();
+ m_mapoffset = ReadUInt64();
+ m_metaoffset = ReadUInt64();
+ m_hunkbytes = ReadUInt32();
m_hunkcount = (m_logicalbytes + m_hunkbytes - 1) / m_hunkbytes;
- m_unitbytes = m_br.ReadUInt32();
+ m_unitbytes = ReadUInt32();
m_unitcount = (m_logicalbytes + m_unitbytes - 1) / m_unitbytes;
// m_allow_writes = !compressed();
@@ -315,5 +313,25 @@ namespace SabreTools.Library.External
}
#endregion
+
+ #region Helpers
+
+ ///
+ /// Read a proper UInt32 from the stream
+ ///
+ private uint ReadUInt32()
+ {
+ return BitConverter.ToUInt32(m_br.ReadBytes(4).Reverse().ToArray(), 0);
+ }
+
+ ///
+ /// Read a proper UInt64 from the stream
+ ///
+ private ulong ReadUInt64()
+ {
+ return BitConverter.ToUInt64(m_br.ReadBytes(8).Reverse().ToArray(), 0);
+ }
+
+ #endregion
}
}