[CHDFile] Make parsing values from CHD easier

This commit is contained in:
Matt Nadareski
2017-10-31 10:46:41 -07:00
parent 1e34df2d45
commit ae154ae02c

View File

@@ -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
/// <summary>
/// Read a proper UInt32 from the stream
/// </summary>
private uint ReadUInt32()
{
return BitConverter.ToUInt32(m_br.ReadBytes(4).Reverse().ToArray(), 0);
}
/// <summary>
/// Read a proper UInt64 from the stream
/// </summary>
private ulong ReadUInt64()
{
return BitConverter.ToUInt64(m_br.ReadBytes(8).Reverse().ToArray(), 0);
}
#endregion
}
}