using System; using System.Text; namespace RobloxFiles.DataTypes { /// /// ProtectedString is a type used by the Source property of scripts. /// If constructed as an array of bytes, it's assumed to be compiled byte-code. /// public class ProtectedString { public readonly bool IsCompiled; public readonly byte[] RawBuffer; public override string ToString() { if (IsCompiled) return $"byte[{RawBuffer.Length}]"; return Encoding.UTF8.GetString(RawBuffer); } public ProtectedString(string value) { IsCompiled = false; RawBuffer = Encoding.UTF8.GetBytes(value); } public ProtectedString(byte[] compiled) { IsCompiled = true; RawBuffer = compiled; } public static implicit operator string(ProtectedString protectedString) { return Encoding.UTF8.GetString(protectedString.RawBuffer); } public static implicit operator ProtectedString(string value) { return new ProtectedString(value); } public static implicit operator byte[](ProtectedString protectedString) { return protectedString.RawBuffer; } public static implicit operator ProtectedString(byte[] value) { return new ProtectedString(value); } public override bool Equals(object obj) { if (!(obj is ProtectedString)) return false; var other = obj as ProtectedString; var otherBuffer = other.RawBuffer; if (RawBuffer.Length != otherBuffer.Length) return false; for (int i = 0; i < RawBuffer.Length; i++) if (RawBuffer[i] != otherBuffer[i]) return false; return true; } public override int GetHashCode() { var str = Convert.ToBase64String(RawBuffer); return str.GetHashCode(); } } }