diff options
Diffstat (limited to 'Ryujinx.HLE/Utilities')
| -rw-r--r-- | Ryujinx.HLE/Utilities/UInt128.cs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/Ryujinx.HLE/Utilities/UInt128.cs b/Ryujinx.HLE/Utilities/UInt128.cs new file mode 100644 index 00000000..a2546dd3 --- /dev/null +++ b/Ryujinx.HLE/Utilities/UInt128.cs @@ -0,0 +1,61 @@ +using Ryujinx.HLE.Utilities; +using System; +using System.IO; +using System.Linq; + +namespace Ryujinx.HLE.Utilities +{ + public struct UInt128 + { + public long High { get; private set; } + public long Low { get; private set; } + + public UInt128(long Low, long High) + { + this.Low = Low; + this.High = High; + + byte[] Bytes = new byte[16]; + + int Index = Bytes.Length; + + void WriteBytes(long Value) + { + for (int Byte = 0; Byte < 8; Byte++) + { + Bytes[--Index] = (byte)(Value >> Byte * 8); + } + } + + WriteBytes(Low); + WriteBytes(High); + } + + public UInt128(string UInt128Hex) + { + if (UInt128Hex == null || UInt128Hex.Length != 32 || !UInt128Hex.All("0123456789abcdefABCDEF".Contains)) + { + throw new ArgumentException("Invalid Hex value!", nameof(UInt128Hex)); + } + + Low = Convert.ToInt64(UInt128Hex.Substring(16),16); + High = Convert.ToInt64(UInt128Hex.Substring(0, 16), 16); + } + + public void Write(BinaryWriter BinaryWriter) + { + BinaryWriter.Write(High); + BinaryWriter.Write(Low); + } + + public override string ToString() + { + return High.ToString("x16") + Low.ToString("x16"); + } + + public bool IsZero() + { + return (Low | High) == 0; + } + } +}
\ No newline at end of file |
