mirror of
https://github.com/kwsch/NHSE.git
synced 2026-09-08 19:25:21 -05:00
Initial commit
This commit is contained in:
72
NHSE.Core/Save/Meta/EncryptedFilePair.cs
Normal file
72
NHSE.Core/Save/Meta/EncryptedFilePair.cs
Normal file
@@ -0,0 +1,72 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace NHSE.Core
|
||||
{
|
||||
public abstract class EncryptedFilePair
|
||||
{
|
||||
public readonly byte[] Data;
|
||||
public readonly byte[] Header;
|
||||
|
||||
public readonly FileHeaderInfo Info;
|
||||
|
||||
public readonly string DataPath;
|
||||
public readonly string HeaderPath;
|
||||
public readonly string NameData;
|
||||
public readonly string NameHeader;
|
||||
|
||||
protected EncryptedFilePair(string folder, string name)
|
||||
{
|
||||
NameData = $"{name}.dat";
|
||||
NameHeader = $"{name}Header.dat";
|
||||
var hdr = Path.Combine(folder, NameHeader);
|
||||
var dat = Path.Combine(folder, NameData);
|
||||
|
||||
var hd = File.ReadAllBytes(hdr);
|
||||
var md = File.ReadAllBytes(dat);
|
||||
|
||||
var decrypted = Encryption.Decrypt(hd, md);
|
||||
|
||||
Header = hd;
|
||||
Data = decrypted;
|
||||
DataPath = dat;
|
||||
HeaderPath = hdr;
|
||||
|
||||
Info = Header.Slice(0, FileHeaderInfo.SIZE).ToClass<FileHeaderInfo>();
|
||||
}
|
||||
|
||||
public void Save(uint seed)
|
||||
{
|
||||
var encrypt = Encryption.Encrypt(Data, seed, Header);
|
||||
File.WriteAllBytes(DataPath, encrypt.Data);
|
||||
File.WriteAllBytes(HeaderPath, encrypt.Header);
|
||||
}
|
||||
|
||||
public void Hash()
|
||||
{
|
||||
var ver = Info.GetKnownRevisionIndex();
|
||||
var hash = RevisionChecker.HashInfo[ver];
|
||||
var details = hash.GetFile(NameData);
|
||||
if (details == null)
|
||||
throw new ArgumentNullException(nameof(NameData));
|
||||
foreach (var h in details.HashRegions)
|
||||
Murmur3.UpdateMurmur32(Data, h.HashOffset, h.BeginOffset, (uint)h.Size);
|
||||
}
|
||||
|
||||
public string GetString(int offset, int maxLength)
|
||||
{
|
||||
var str = Encoding.Unicode.GetString(Data, offset, maxLength * 2);
|
||||
return StringUtil.TrimFromZero(str);
|
||||
}
|
||||
|
||||
public static byte[] GetBytes(string value, int maxLength)
|
||||
{
|
||||
if (value.Length > maxLength)
|
||||
value = value.Substring(0, maxLength);
|
||||
else if (value.Length < maxLength)
|
||||
value = value.PadRight(maxLength, '\0');
|
||||
return Encoding.Unicode.GetBytes(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user