81 lines
2.2 KiB
C#
81 lines
2.2 KiB
C#
using System;
|
|
using System.Text;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace AssetStudio
|
|
{
|
|
public enum MiHoYoBinDataType
|
|
{
|
|
None,
|
|
Bytes,
|
|
JSON
|
|
}
|
|
public sealed class MiHoYoBinData : Object
|
|
{
|
|
private static Regex ASCII = new Regex("[^\u0020-\u007E]", RegexOptions.Compiled);
|
|
|
|
public static bool Exportable;
|
|
public static bool Encrypted;
|
|
public static byte Key;
|
|
|
|
public byte[] RawData;
|
|
|
|
public MiHoYoBinData(ObjectReader reader) : base(reader)
|
|
{
|
|
var length = reader.ReadInt32();
|
|
RawData = reader.ReadBytes(length);
|
|
}
|
|
|
|
public string AsString => Type switch
|
|
{
|
|
MiHoYoBinDataType.JSON => JToken.Parse(DataStr).ToString(Formatting.Indented),
|
|
MiHoYoBinDataType.Bytes => ASCII.Replace(DataStr, string.Empty),
|
|
_ => "",
|
|
};
|
|
public new object Dump() => Type switch
|
|
{
|
|
MiHoYoBinDataType.JSON => AsString,
|
|
MiHoYoBinDataType.Bytes => Data,
|
|
_ => null,
|
|
};
|
|
private string DataStr => Encoding.UTF8.GetString(Data);
|
|
|
|
public MiHoYoBinDataType Type
|
|
{
|
|
get
|
|
{
|
|
try
|
|
{
|
|
var asToken = JToken.Parse(DataStr);
|
|
if (asToken.Type == JTokenType.Object || asToken.Type == JTokenType.Array)
|
|
return MiHoYoBinDataType.JSON;
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return MiHoYoBinDataType.Bytes;
|
|
}
|
|
return MiHoYoBinDataType.None;
|
|
}
|
|
}
|
|
|
|
private byte[] Data
|
|
{
|
|
get
|
|
{
|
|
if (Encrypted)
|
|
{
|
|
byte[] bytes = new byte[RawData.Length];
|
|
for (int i = 0; i < RawData.Length; i++)
|
|
{
|
|
bytes[i] = (byte)(RawData[i] ^ Key);
|
|
}
|
|
return bytes;
|
|
}
|
|
else return RawData;
|
|
}
|
|
}
|
|
}
|
|
}
|