mirror of
https://github.com/KillzXGaming/Switch-Toolbox
synced 2024-11-26 14:30:26 +00:00
42f6b670e0
Fix zlib compression corrupting the file. Fix sarc and msbt format descriptions. Adjust when a file in an IArchiveFile gets saved. Porgress on MTA 0X50 compression type. not finished atm. Start on ICompressionFormat interface. Will soon be the way compression formats are all handled.
87 lines
No EOL
2.6 KiB
C#
87 lines
No EOL
2.6 KiB
C#
// Copyright(c) 2014 Mads Breusch Klinkby. All rights reserved.
|
|
// Licensed under the MIT License; you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at https://opensource.org/licenses/MIT
|
|
// Published at https://github.com/klinkby/klinkby.checksum
|
|
|
|
using System.Text;
|
|
|
|
namespace System.Security.Cryptography
|
|
{
|
|
/// <summary>
|
|
/// Computes a CRC32 checksum.
|
|
/// </summary>
|
|
/// <remarks>Based on <see cref="http://sanity-free.org/12/crc32_implementation_in_csharp.html"/></remarks>
|
|
public static class Crc32
|
|
{
|
|
readonly static uint[] Table = CreateTable();
|
|
|
|
static Crc32()
|
|
{ }
|
|
|
|
/// <summary>
|
|
/// Compute the checksum of a UTF8 text.
|
|
/// </summary>
|
|
/// <param name="text">Text to calculate</param>
|
|
/// <returns>Checksum</returns>
|
|
public static uint Compute(string text)
|
|
{
|
|
return Compute(text, Encoding.UTF8);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Compute the checksum of a text using a specific encoding.
|
|
/// </summary>
|
|
/// <param name="text">Text to calculate</param>
|
|
/// <param name="encoding">Text encoding</param>
|
|
/// <returns>Checksum</returns>
|
|
public static uint Compute(string text, Encoding encoding)
|
|
{
|
|
if (string.IsNullOrEmpty(text)) return 0;
|
|
byte[] bytes = encoding.GetBytes(text);
|
|
return Compute(bytes);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Compute the checksum of a binary buffer.
|
|
/// </summary>
|
|
/// <param name="bytes">Buffer to calculate</param>
|
|
/// <returns></returns>
|
|
public static uint Compute(byte[] bytes)
|
|
{
|
|
uint crc = 0xffffffff;
|
|
for (int i = 0; i < bytes.Length; ++i)
|
|
{
|
|
byte index = (byte)(((crc) & 0xff) ^ bytes[i]);
|
|
crc = (crc >> 8) ^ Table[index];
|
|
}
|
|
|
|
return unchecked((~crc));
|
|
}
|
|
|
|
static uint[] CreateTable()
|
|
{
|
|
const uint poly = 0xedb88320;
|
|
var table = new uint[256];
|
|
uint temp = 0;
|
|
for (uint i = 0; i < table.Length; ++i)
|
|
{
|
|
temp = i;
|
|
for (int j = 8; j > 0; --j)
|
|
{
|
|
if ((temp & 1) == 1)
|
|
{
|
|
temp = (uint)((temp >> 1) ^ poly);
|
|
}
|
|
else
|
|
{
|
|
temp >>= 1;
|
|
}
|
|
}
|
|
|
|
table[i] = temp;
|
|
}
|
|
|
|
return table;
|
|
}
|
|
}
|
|
} |