Start to impliment RSTB table.
This commit is contained in:
parent
d1adbc5547
commit
e22005bbea
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
123
Switch_FileFormatsMain/FileFormats/SizeTables/RSTB.cs
Normal file
123
Switch_FileFormatsMain/FileFormats/SizeTables/RSTB.cs
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Switch_Toolbox.Library.IO;
|
||||||
|
|
||||||
|
namespace FirstPlugin.FileFormats
|
||||||
|
{
|
||||||
|
//Parsing based on wiki https://zeldamods.org/wiki/ResourceSizeTable.product.rsizetable
|
||||||
|
//Functions from https://github.com/zeldamods/rstb/blob/master/rstb/rstb.py
|
||||||
|
//Copyright 2018 leoetlino <leo@leolam.fr>
|
||||||
|
//Licensed under GPLv2+
|
||||||
|
// Copy of license can be found under Lib/Licenses
|
||||||
|
|
||||||
|
public class RSTB
|
||||||
|
{
|
||||||
|
public Dictionary<string, uint> NameTables { get; set; }
|
||||||
|
public Dictionary<uint, uint> Crc32Tables { get; set; }
|
||||||
|
|
||||||
|
public void LoadFile(string FileName) {
|
||||||
|
Read(new FileReader(FileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
public RSTB()
|
||||||
|
{
|
||||||
|
Crc32Tables = new Dictionary<uint, uint>();
|
||||||
|
NameTables = new Dictionary<string, uint>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Read(FileReader reader)
|
||||||
|
{
|
||||||
|
reader.ReadSignature(4, "RSTB");
|
||||||
|
uint Crc32TableCount = reader.ReadUInt32();
|
||||||
|
uint NameTableCount = reader.ReadUInt32();
|
||||||
|
|
||||||
|
for (int i = 0; i < Crc32TableCount; i++)
|
||||||
|
{
|
||||||
|
uint Crc32 = reader.ReadUInt32();
|
||||||
|
uint Size = reader.ReadUInt32();
|
||||||
|
Crc32Tables.Add(Crc32, Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < NameTableCount; i++)
|
||||||
|
{
|
||||||
|
string Name = reader.ReadString(128);
|
||||||
|
uint Size = reader.ReadUInt32();
|
||||||
|
NameTables.Add(Name, Size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Write(FileWriter writer)
|
||||||
|
{
|
||||||
|
writer.WriteSignature("RSTB");
|
||||||
|
writer.Write(Crc32Tables.Count);
|
||||||
|
writer.Write(NameTables.Count);
|
||||||
|
|
||||||
|
foreach (var table in Crc32Tables)
|
||||||
|
{
|
||||||
|
writer.Write(table.Key);
|
||||||
|
writer.Write(table.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var table in NameTables)
|
||||||
|
{
|
||||||
|
writer.Write(table.Key.ToByteArray(128));
|
||||||
|
writer.Write(table.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint GetSize(string Name)
|
||||||
|
{
|
||||||
|
uint Crc32 = Name.EncodeCrc32();
|
||||||
|
if (Crc32Tables.ContainsKey(Crc32))
|
||||||
|
return Crc32Tables[Crc32];
|
||||||
|
if (NameTables.ContainsKey(Name))
|
||||||
|
return NameTables[Name];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint SetSize(string Name)
|
||||||
|
{
|
||||||
|
if (IsNeededInNameMap(Name))
|
||||||
|
{
|
||||||
|
if (Name.Length > 128)
|
||||||
|
throw new Exception("Name is too long! Must be smaller than 128 characters!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint Crc32 = Name.EncodeCrc32();
|
||||||
|
if (Crc32Tables.ContainsKey(Crc32))
|
||||||
|
return Crc32Tables[Crc32];
|
||||||
|
if (NameTables.ContainsKey(Name))
|
||||||
|
return NameTables[Name];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetBufferSize()
|
||||||
|
{
|
||||||
|
return (4 + 4 + 4) + 8 * Crc32Tables.Count + (132 * NameTables.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsInTable(string Name)
|
||||||
|
{
|
||||||
|
uint Crc32 = Name.EncodeCrc32();
|
||||||
|
if (Crc32Tables.ContainsKey(Crc32) || NameTables.ContainsKey(Name))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsNeededInNameMap(string Name)
|
||||||
|
{
|
||||||
|
uint Crc32 = Name.EncodeCrc32();
|
||||||
|
foreach (var existingName in NameTables.Keys)
|
||||||
|
if (Crc32Tables.ContainsKey(existingName.EncodeCrc32()))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -234,6 +234,7 @@
|
|||||||
<Compile Include="FileFormats\Audio\Archives\BFGRP.cs" />
|
<Compile Include="FileFormats\Audio\Archives\BFGRP.cs" />
|
||||||
<Compile Include="FileFormats\GFBMDL\GFBMDL.cs" />
|
<Compile Include="FileFormats\GFBMDL\GFBMDL.cs" />
|
||||||
<Compile Include="FileFormats\Hashes\SAHT.cs" />
|
<Compile Include="FileFormats\Hashes\SAHT.cs" />
|
||||||
|
<Compile Include="FileFormats\SizeTables\RSTB.cs" />
|
||||||
<Compile Include="FileFormats\Shader\NSWShaderDecompile.cs" />
|
<Compile Include="FileFormats\Shader\NSWShaderDecompile.cs" />
|
||||||
<Compile Include="FileFormats\Shader\NUSHDB.cs" />
|
<Compile Include="FileFormats\Shader\NUSHDB.cs" />
|
||||||
<Compile Include="FileFormats\Shader\NVNSH.cs" />
|
<Compile Include="FileFormats\Shader\NVNSH.cs" />
|
||||||
|
Binary file not shown.
@ -1 +1 @@
|
|||||||
5e2bb78fbebca632406427d80546922252d8f7ff
|
a5f8e3bc83ca333f1641f1a9eb9720cb2bff4cb6
|
||||||
|
Binary file not shown.
87
Switch_Toolbox_Library/Cryptography/crc32.cs
Normal file
87
Switch_Toolbox_Library/Cryptography/crc32.cs
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Text;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
|
||||||
namespace Switch_Toolbox.Library.IO
|
namespace Switch_Toolbox.Library.IO
|
||||||
{
|
{
|
||||||
@ -25,6 +26,16 @@ namespace Switch_Toolbox.Library.IO
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static byte[] ToByteArray(this string str, int length)
|
||||||
|
{
|
||||||
|
return Encoding.ASCII.GetBytes(str.PadRight(length, ' '));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static uint EncodeCrc32(this string str)
|
||||||
|
{
|
||||||
|
return Crc32.Compute(str);
|
||||||
|
}
|
||||||
|
|
||||||
public static bool Matches(this byte[] arr, uint startIndex, params char[] magic)
|
public static bool Matches(this byte[] arr, uint startIndex, params char[] magic)
|
||||||
{
|
{
|
||||||
if (arr.Length < magic.Length + startIndex) return false;
|
if (arr.Length < magic.Length + startIndex) return false;
|
||||||
|
@ -205,6 +205,7 @@
|
|||||||
<Compile Include="Audio\VGAudioFile.cs" />
|
<Compile Include="Audio\VGAudioFile.cs" />
|
||||||
<Compile Include="Collections\SortExtensions.cs" />
|
<Compile Include="Collections\SortExtensions.cs" />
|
||||||
<Compile Include="Config.cs" />
|
<Compile Include="Config.cs" />
|
||||||
|
<Compile Include="Cryptography\crc32.cs" />
|
||||||
<Compile Include="DrawableContainer.cs" />
|
<Compile Include="DrawableContainer.cs" />
|
||||||
<Compile Include="FileFormats\3DS\ETC1.cs" />
|
<Compile Include="FileFormats\3DS\ETC1.cs" />
|
||||||
<Compile Include="FileFormats\Animation\SMD.cs" />
|
<Compile Include="FileFormats\Animation\SMD.cs" />
|
||||||
|
Loading…
Reference in New Issue
Block a user