mirror of
https://github.com/AdmiralCurtiss/WfcPatcher.git
synced 2026-04-25 15:35:25 -05:00
Fix checksums for devices that care about that.
This commit is contained in:
parent
49b55ff173
commit
6c48af3434
51
Crc16.cs
Normal file
51
Crc16.cs
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
// modified from http://www.sanity-free.org/134/standard_crc_16_in_csharp.html
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace WfcPatcher {
|
||||
public class Crc16 {
|
||||
private ushort[] table = new ushort[256];
|
||||
|
||||
public ushort ComputeChecksum( byte[] bytes ) {
|
||||
ushort crc = 0;
|
||||
for ( int i = 0; i < bytes.Length; ++i ) {
|
||||
byte index = (byte)( crc ^ bytes[i] );
|
||||
crc = (ushort)( ( crc >> 8 ) ^ table[index] );
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
public ushort ComputeChecksum( Stream stream, int length, ushort init = 0 ) {
|
||||
ushort crc = init;
|
||||
for ( int i = 0; i < length; ++i ) {
|
||||
byte index = (byte)( ( crc ^ stream.ReadByte() ) & 0xFF );
|
||||
crc = (ushort)( ( crc >> 8 ) ^ table[index] );
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
public byte[] ComputeChecksumBytes( byte[] bytes ) {
|
||||
ushort crc = ComputeChecksum( bytes );
|
||||
return BitConverter.GetBytes( crc );
|
||||
}
|
||||
|
||||
public Crc16( ushort polynomial = 0xA001 ) {
|
||||
ushort value;
|
||||
ushort temp;
|
||||
for ( ushort i = 0; i < table.Length; ++i ) {
|
||||
value = 0;
|
||||
temp = i;
|
||||
for ( byte j = 0; j < 8; ++j ) {
|
||||
if ( ( ( value ^ temp ) & 0x0001 ) != 0 ) {
|
||||
value = (ushort)( ( value >> 1 ) ^ polynomial );
|
||||
} else {
|
||||
value >>= 1;
|
||||
}
|
||||
temp >>= 1;
|
||||
}
|
||||
table[i] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
10
Program.cs
10
Program.cs
|
|
@ -177,6 +177,16 @@ namespace WfcPatcher {
|
|||
byte[] newSizeBytes = BitConverter.GetBytes( newSize );
|
||||
nds.Position = 0x2C;
|
||||
nds.Write( newSizeBytes, 0, 4 );
|
||||
|
||||
// recalculate checksums
|
||||
nds.Position = pos;
|
||||
ushort secureChecksum = new Crc16().ComputeChecksum( nds, 0x4000, 0xFFFF );
|
||||
nds.Position = 0x6C;
|
||||
nds.Write( BitConverter.GetBytes( secureChecksum ), 0, 2 );
|
||||
|
||||
nds.Position = 0;
|
||||
ushort headerChecksum = new Crc16().ComputeChecksum( nds, 0x15E, 0xFFFF );
|
||||
nds.Write( BitConverter.GetBytes( headerChecksum ), 0, 2 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
<ItemGroup>
|
||||
<Compile Include="blz.cs" />
|
||||
<Compile Include="ByteArrayRocks.cs" />
|
||||
<Compile Include="Crc16.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Util.cs" />
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user