diff --git a/Headerer/Features/Extract.cs b/Headerer/Features/Extract.cs index 2533e80e..7ed8ce50 100644 --- a/Headerer/Features/Extract.cs +++ b/Headerer/Features/Extract.cs @@ -1,10 +1,10 @@ using System.IO; using System.Collections.Generic; using Microsoft.Data.Sqlite; -using SabreTools.Core.Tools; using SabreTools.Hashing; using SabreTools.Help; using SabreTools.IO; +using SabreTools.IO.Extensions; using SabreTools.Skippers; namespace Headerer.Features @@ -91,7 +91,7 @@ The following systems have headers that this program can work with: int startOffset = int.Parse(rule.StartOffset ?? "0"); byte[] hbin = new byte[startOffset]; fs.Read(hbin, 0, startOffset); - hstr = TextHelper.ByteArrayToString(hbin)!; + hstr = ByteArrayExtensions.ByteArrayToString(hbin)!; } catch { diff --git a/Headerer/Features/Restore.cs b/Headerer/Features/Restore.cs index 10356078..4aa37ef1 100644 --- a/Headerer/Features/Restore.cs +++ b/Headerer/Features/Restore.cs @@ -1,10 +1,10 @@ using System.IO; using System.Collections.Generic; using Microsoft.Data.Sqlite; -using SabreTools.Core.Tools; using SabreTools.Hashing; using SabreTools.Help; using SabreTools.IO; +using SabreTools.IO.Extensions; namespace Headerer.Features { @@ -79,7 +79,7 @@ The following systems have headers that this program can work with: { string outputFile = (string.IsNullOrWhiteSpace(outDir) ? $"{Path.GetFullPath(file)}.new" : Path.Combine(outDir, Path.GetFileName(file))) + i; logger.User($"Creating reheadered file: {outputFile}"); - AppendBytes(file, outputFile, TextHelper.StringToByteArray(headers[i]), null); + AppendBytes(file, outputFile, ByteArrayExtensions.StringToByteArray(headers[i]), null); logger.User("Reheadered file created!"); } diff --git a/RombaSharp/Features/BaseFeature.cs b/RombaSharp/Features/BaseFeature.cs index d23c0186..403f7ae0 100644 --- a/RombaSharp/Features/BaseFeature.cs +++ b/RombaSharp/Features/BaseFeature.cs @@ -13,6 +13,7 @@ using SabreTools.DatTools; using SabreTools.FileTypes; using SabreTools.Hashing; using SabreTools.Help; +using SabreTools.IO.Extensions; using SabreTools.IO.Logging; namespace RombaSharp.Features @@ -562,7 +563,7 @@ CREATE TABLE IF NOT EXISTS dat ( if (lowerCaseDats.Contains(input.ToLowerInvariant())) { string fullpath = Path.GetFullPath(datRootDats[lowerCaseDats.IndexOf(input.ToLowerInvariant())]); - string? sha1 = TextHelper.ByteArrayToString(BaseFile.GetInfo(fullpath, hashes: [HashType.SHA1])?.SHA1); + string? sha1 = ByteArrayExtensions.ByteArrayToString(BaseFile.GetInfo(fullpath, hashes: [HashType.SHA1])?.SHA1); if (sha1 != null) foundDats.Add(sha1, fullpath); } diff --git a/SabreTools.Core/Tools/TextHelper.cs b/SabreTools.Core/Tools/TextHelper.cs index 4c190bdf..ecfdb7ad 100644 --- a/SabreTools.Core/Tools/TextHelper.cs +++ b/SabreTools.Core/Tools/TextHelper.cs @@ -1,4 +1,3 @@ -using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; @@ -8,56 +7,6 @@ namespace SabreTools.Core.Tools { public static class TextHelper { - #region Conversion - - /// - /// Convert a byte array to a hex string - /// - public static string? ByteArrayToString(byte[]? bytes) - { - // If we get null in, we send null out - if (bytes == null) - return null; - - try - { - string hex = BitConverter.ToString(bytes); - return hex.Replace("-", string.Empty).ToLowerInvariant(); - } - catch - { - return null; - } - } - - /// - /// Convert a hex string to a byte array - /// - public static byte[]? StringToByteArray(string? hex) - { - // If we get null in, we send null out - if (string.IsNullOrEmpty(hex)) - return null; - - try - { - int NumberChars = hex!.Length; - byte[] bytes = new byte[NumberChars / 2]; - for (int i = 0; i < NumberChars; i += 2) - { - bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); - } - - return bytes; - } - catch - { - return null; - } - } - - #endregion - #region Normalization /// diff --git a/SabreTools.DatItems/Formats/Disk.cs b/SabreTools.DatItems/Formats/Disk.cs index 9ecec77e..e10e09dc 100644 --- a/SabreTools.DatItems/Formats/Disk.cs +++ b/SabreTools.DatItems/Formats/Disk.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.FileTypes; +using SabreTools.IO.Extensions; namespace SabreTools.DatItems.Formats { @@ -74,8 +75,8 @@ namespace SabreTools.DatItems.Formats public Disk(BaseFile baseFile) : base() { SetName(baseFile.Filename); - SetFieldValue(Models.Metadata.Disk.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); - SetFieldValue(Models.Metadata.Disk.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); + SetFieldValue(Models.Metadata.Disk.MD5Key, ByteArrayExtensions.ByteArrayToString(baseFile.MD5)); + SetFieldValue(Models.Metadata.Disk.SHA1Key, ByteArrayExtensions.ByteArrayToString(baseFile.SHA1)); SetFieldValue(DatItem.DupeTypeKey, 0x00); } @@ -93,8 +94,8 @@ namespace SabreTools.DatItems.Formats { Filename = this.GetName(), Parent = GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey), - MD5 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Disk.MD5Key)), - SHA1 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Disk.SHA1Key)), + MD5 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Disk.MD5Key)), + SHA1 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Disk.SHA1Key)), }; } diff --git a/SabreTools.DatItems/Formats/File.cs b/SabreTools.DatItems/Formats/File.cs index 1e3baa8a..5c1f3bae 100644 --- a/SabreTools.DatItems/Formats/File.cs +++ b/SabreTools.DatItems/Formats/File.cs @@ -4,6 +4,7 @@ using Newtonsoft.Json; using SabreTools.Core.Tools; using SabreTools.FileTypes; using SabreTools.Hashing; +using SabreTools.IO.Extensions; using SabreTools.Matching; // TODO: Add item mappings for all fields @@ -53,8 +54,8 @@ namespace SabreTools.DatItems.Formats [JsonProperty("crc", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("crc")] public string? CRC { - get { return _crc.IsNullOrEmpty() ? null : TextHelper.ByteArrayToString(_crc); } - set { _crc = (value == "null" ? Constants.CRCZeroBytes : TextHelper.StringToByteArray(TextHelper.NormalizeCRC32(value))); } + get { return _crc.IsNullOrEmpty() ? null : ByteArrayExtensions.ByteArrayToString(_crc); } + set { _crc = (value == "null" ? Constants.CRCZeroBytes : ByteArrayExtensions.StringToByteArray(TextHelper.NormalizeCRC32(value))); } } /// @@ -63,8 +64,8 @@ namespace SabreTools.DatItems.Formats [JsonProperty("md5", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("md5")] public string? MD5 { - get { return _md5.IsNullOrEmpty() ? null : TextHelper.ByteArrayToString(_md5); } - set { _md5 = TextHelper.StringToByteArray(TextHelper.NormalizeMD5(value)); } + get { return _md5.IsNullOrEmpty() ? null : ByteArrayExtensions.ByteArrayToString(_md5); } + set { _md5 = ByteArrayExtensions.StringToByteArray(TextHelper.NormalizeMD5(value)); } } /// @@ -73,8 +74,8 @@ namespace SabreTools.DatItems.Formats [JsonProperty("sha1", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha1")] public string? SHA1 { - get { return _sha1.IsNullOrEmpty() ? null : TextHelper.ByteArrayToString(_sha1); } - set { _sha1 = TextHelper.StringToByteArray(TextHelper.NormalizeSHA1(value)); } + get { return _sha1.IsNullOrEmpty() ? null : ByteArrayExtensions.ByteArrayToString(_sha1); } + set { _sha1 = ByteArrayExtensions.StringToByteArray(TextHelper.NormalizeSHA1(value)); } } /// @@ -83,8 +84,8 @@ namespace SabreTools.DatItems.Formats [JsonProperty("sha256", DefaultValueHandling = DefaultValueHandling.Ignore), XmlElement("sha256")] public string? SHA256 { - get { return _sha256.IsNullOrEmpty() ? null : TextHelper.ByteArrayToString(_sha256); } - set { _sha256 = TextHelper.StringToByteArray(TextHelper.NormalizeSHA256(value)); } + get { return _sha256.IsNullOrEmpty() ? null : ByteArrayExtensions.ByteArrayToString(_sha256); } + set { _sha256 = ByteArrayExtensions.StringToByteArray(TextHelper.NormalizeSHA256(value)); } } /// diff --git a/SabreTools.DatItems/Formats/Media.cs b/SabreTools.DatItems/Formats/Media.cs index 27cf4b5e..94b258a7 100644 --- a/SabreTools.DatItems/Formats/Media.cs +++ b/SabreTools.DatItems/Formats/Media.cs @@ -1,8 +1,8 @@ using System.Xml.Serialization; using Newtonsoft.Json; using SabreTools.Core; -using SabreTools.Core.Tools; using SabreTools.FileTypes; +using SabreTools.IO.Extensions; namespace SabreTools.DatItems.Formats { @@ -37,9 +37,9 @@ namespace SabreTools.DatItems.Formats public Media(BaseFile baseFile) : base() { SetName(baseFile.Filename); - SetFieldValue(Models.Metadata.Media.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); - SetFieldValue(Models.Metadata.Media.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); - SetFieldValue(Models.Metadata.Media.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256)); + SetFieldValue(Models.Metadata.Media.MD5Key, ByteArrayExtensions.ByteArrayToString(baseFile.MD5)); + SetFieldValue(Models.Metadata.Media.SHA1Key, ByteArrayExtensions.ByteArrayToString(baseFile.SHA1)); + SetFieldValue(Models.Metadata.Media.SHA256Key, ByteArrayExtensions.ByteArrayToString(baseFile.SHA256)); SetFieldValue(Models.Metadata.Media.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum ?? [])); SetFieldValue(DatItem.DupeTypeKey, 0x00); @@ -58,9 +58,9 @@ namespace SabreTools.DatItems.Formats { Filename = this.GetName(), Parent = GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey), - MD5 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Media.MD5Key)), - SHA1 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Media.SHA1Key)), - SHA256 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Media.SHA256Key)), + MD5 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Media.MD5Key)), + SHA1 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Media.SHA1Key)), + SHA256 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Media.SHA256Key)), SpamSum = System.Text.Encoding.UTF8.GetBytes(GetStringFieldValue(Models.Metadata.Media.SpamSumKey) ?? string.Empty), }; } diff --git a/SabreTools.DatItems/Formats/Rom.cs b/SabreTools.DatItems/Formats/Rom.cs index dcaf356c..e7c4c587 100644 --- a/SabreTools.DatItems/Formats/Rom.cs +++ b/SabreTools.DatItems/Formats/Rom.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using SabreTools.Core; using SabreTools.Core.Tools; using SabreTools.FileTypes; +using SabreTools.IO.Extensions; namespace SabreTools.DatItems.Formats { @@ -94,12 +95,12 @@ namespace SabreTools.DatItems.Formats { SetName(baseFile.Filename); SetFieldValue(Models.Metadata.Rom.DateKey, baseFile.Date); - SetFieldValue(Models.Metadata.Rom.CRCKey, TextHelper.ByteArrayToString(baseFile.CRC)); - SetFieldValue(Models.Metadata.Rom.MD5Key, TextHelper.ByteArrayToString(baseFile.MD5)); - SetFieldValue(Models.Metadata.Rom.SHA1Key, TextHelper.ByteArrayToString(baseFile.SHA1)); - SetFieldValue(Models.Metadata.Rom.SHA256Key, TextHelper.ByteArrayToString(baseFile.SHA256)); - SetFieldValue(Models.Metadata.Rom.SHA384Key, TextHelper.ByteArrayToString(baseFile.SHA384)); - SetFieldValue(Models.Metadata.Rom.SHA512Key, TextHelper.ByteArrayToString(baseFile.SHA512)); + SetFieldValue(Models.Metadata.Rom.CRCKey, ByteArrayExtensions.ByteArrayToString(baseFile.CRC)); + SetFieldValue(Models.Metadata.Rom.MD5Key, ByteArrayExtensions.ByteArrayToString(baseFile.MD5)); + SetFieldValue(Models.Metadata.Rom.SHA1Key, ByteArrayExtensions.ByteArrayToString(baseFile.SHA1)); + SetFieldValue(Models.Metadata.Rom.SHA256Key, ByteArrayExtensions.ByteArrayToString(baseFile.SHA256)); + SetFieldValue(Models.Metadata.Rom.SHA384Key, ByteArrayExtensions.ByteArrayToString(baseFile.SHA384)); + SetFieldValue(Models.Metadata.Rom.SHA512Key, ByteArrayExtensions.ByteArrayToString(baseFile.SHA512)); SetFieldValue(Models.Metadata.Rom.SizeKey, baseFile.Size.ToString()); if (baseFile.SpamSum != null) SetFieldValue(Models.Metadata.Rom.SpamSumKey, System.Text.Encoding.UTF8.GetString(baseFile.SpamSum)); @@ -128,12 +129,12 @@ namespace SabreTools.DatItems.Formats Parent = GetFieldValue(DatItem.MachineKey)!.GetStringFieldValue(Models.Metadata.Machine.NameKey), Date = GetStringFieldValue(Models.Metadata.Rom.DateKey), Size = NumberHelper.ConvertToInt64(GetStringFieldValue(Models.Metadata.Rom.SizeKey)), - CRC = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.CRCKey)), - MD5 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.MD5Key)), - SHA1 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.SHA1Key)), - SHA256 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.SHA256Key)), - SHA384 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.SHA384Key)), - SHA512 = TextHelper.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.SHA512Key)), + CRC = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.CRCKey)), + MD5 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.MD5Key)), + SHA1 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.SHA1Key)), + SHA256 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.SHA256Key)), + SHA384 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.SHA384Key)), + SHA512 = ByteArrayExtensions.StringToByteArray(GetStringFieldValue(Models.Metadata.Rom.SHA512Key)), SpamSum = spamSum != null ? System.Text.Encoding.UTF8.GetBytes(spamSum) : null, }; } diff --git a/SabreTools.FileTypes/Archives/GZipArchive.cs b/SabreTools.FileTypes/Archives/GZipArchive.cs index faf5e11b..0288c1b9 100644 --- a/SabreTools.FileTypes/Archives/GZipArchive.cs +++ b/SabreTools.FileTypes/Archives/GZipArchive.cs @@ -399,7 +399,7 @@ namespace SabreTools.FileTypes.Archives Size = extractedsize, CRC = headercrc, MD5 = headermd5, - SHA1 = TextHelper.StringToByteArray(Path.GetFileNameWithoutExtension(this.Filename)), + SHA1 = ByteArrayExtensions.StringToByteArray(Path.GetFileNameWithoutExtension(this.Filename)), Parent = Path.GetFileNameWithoutExtension(this.Filename).ToLowerInvariant(), }; @@ -446,7 +446,7 @@ namespace SabreTools.FileTypes.Archives baseFile = GetInfo(inputStream, keepReadOpen: true); // Get the output file name - string outfile = Path.Combine(outDir, Utilities.GetDepotPath(TextHelper.ByteArrayToString(baseFile.SHA1), Depth) ?? string.Empty); + string outfile = Path.Combine(outDir, Utilities.GetDepotPath(ByteArrayExtensions.ByteArrayToString(baseFile.SHA1), Depth) ?? string.Empty); // Check to see if the folder needs to be created if (!Directory.Exists(Path.GetDirectoryName(outfile))) diff --git a/SabreTools.FileTypes/Archives/XZArchive.cs b/SabreTools.FileTypes/Archives/XZArchive.cs index 5c867474..a18d7795 100644 --- a/SabreTools.FileTypes/Archives/XZArchive.cs +++ b/SabreTools.FileTypes/Archives/XZArchive.cs @@ -4,8 +4,8 @@ using System.IO; using System.Text.RegularExpressions; using SabreTools.Core.Tools; using SabreTools.Hashing; -#if NET462_OR_GREATER || NETCOREAPP using SabreTools.IO.Extensions; +#if NET462_OR_GREATER || NETCOREAPP using SharpCompress.Compressors.Xz; #endif @@ -286,7 +286,7 @@ namespace SabreTools.FileTypes.Archives BaseFile baseFile = new() { Filename = Path.GetFileNameWithoutExtension(this.Filename).ToLowerInvariant(), - SHA1 = TextHelper.StringToByteArray(Path.GetFileNameWithoutExtension(this.Filename)), + SHA1 = ByteArrayExtensions.StringToByteArray(Path.GetFileNameWithoutExtension(this.Filename)), Parent = Path.GetFileNameWithoutExtension(this.Filename).ToLowerInvariant(), }; @@ -334,7 +334,7 @@ namespace SabreTools.FileTypes.Archives baseFile = GetInfo(inputStream, keepReadOpen: true); // Get the output file name - string outfile = Path.Combine(outDir, Utilities.GetDepotPath(TextHelper.ByteArrayToString(baseFile.SHA1), Depth)!); + string outfile = Path.Combine(outDir, Utilities.GetDepotPath(ByteArrayExtensions.ByteArrayToString(baseFile.SHA1), Depth)!); outfile = outfile.Replace(".gz", ".xz"); // Check to see if the folder needs to be created diff --git a/SabreTools.FileTypes/BaseFile.cs b/SabreTools.FileTypes/BaseFile.cs index 0a6a4ad3..ae549bb7 100644 --- a/SabreTools.FileTypes/BaseFile.cs +++ b/SabreTools.FileTypes/BaseFile.cs @@ -328,13 +328,13 @@ namespace SabreTools.FileTypes var baseFile = new BaseFile() { Size = size, - CRC = hashDict.ContainsKey(HashType.CRC32) ? TextHelper.StringToByteArray(hashDict[HashType.CRC32]) : null, - MD5 = hashDict.ContainsKey(HashType.MD5) ? TextHelper.StringToByteArray(hashDict[HashType.MD5]) : null, - SHA1 = hashDict.ContainsKey(HashType.SHA1) ? TextHelper.StringToByteArray(hashDict[HashType.SHA1]) : null, - SHA256 = hashDict.ContainsKey(HashType.SHA256) ? TextHelper.StringToByteArray(hashDict[HashType.SHA256]) : null, - SHA384 = hashDict.ContainsKey(HashType.SHA384) ? TextHelper.StringToByteArray(hashDict[HashType.SHA384]) : null, - SHA512 = hashDict.ContainsKey(HashType.SHA512) ? TextHelper.StringToByteArray(hashDict[HashType.SHA512]) : null, - SpamSum = hashDict.ContainsKey(HashType.SpamSum) ? TextHelper.StringToByteArray(hashDict[HashType.SpamSum]) : null, + CRC = hashDict.ContainsKey(HashType.CRC32) ? ByteArrayExtensions.StringToByteArray(hashDict[HashType.CRC32]) : null, + MD5 = hashDict.ContainsKey(HashType.MD5) ? ByteArrayExtensions.StringToByteArray(hashDict[HashType.MD5]) : null, + SHA1 = hashDict.ContainsKey(HashType.SHA1) ? ByteArrayExtensions.StringToByteArray(hashDict[HashType.SHA1]) : null, + SHA256 = hashDict.ContainsKey(HashType.SHA256) ? ByteArrayExtensions.StringToByteArray(hashDict[HashType.SHA256]) : null, + SHA384 = hashDict.ContainsKey(HashType.SHA384) ? ByteArrayExtensions.StringToByteArray(hashDict[HashType.SHA384]) : null, + SHA512 = hashDict.ContainsKey(HashType.SHA512) ? ByteArrayExtensions.StringToByteArray(hashDict[HashType.SHA512]) : null, + SpamSum = hashDict.ContainsKey(HashType.SpamSum) ? ByteArrayExtensions.StringToByteArray(hashDict[HashType.SpamSum]) : null, }; // Deal with the input stream