Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
HexConverter.cs
Go to the documentation of this file.
2
3namespace System;
4
5internal static class HexConverter
6{
7 public enum Casing : uint
8 {
9 Upper = 0u,
10 Lower = 8224u
11 }
12
13 public static ReadOnlySpan<byte> CharToHexLookup => new byte[256]
14 {
15 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
16 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
17 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
18 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
19 255, 255, 255, 255, 255, 255, 255, 255, 0, 1,
20 2, 3, 4, 5, 6, 7, 8, 9, 255, 255,
21 255, 255, 255, 255, 255, 10, 11, 12, 13, 14,
22 15, 255, 255, 255, 255, 255, 255, 255, 255, 255,
23 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
24 255, 255, 255, 255, 255, 255, 255, 10, 11, 12,
25 13, 14, 15, 255, 255, 255, 255, 255, 255, 255,
26 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
27 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
28 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
29 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
30 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
31 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
32 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
33 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
34 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
35 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
36 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
37 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
38 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
39 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
40 255, 255, 255, 255, 255, 255
41 };
42
43 [MethodImpl(MethodImplOptions.AggressiveInlining)]
44 public static void ToBytesBuffer(byte value, Span<byte> buffer, int startingIndex = 0, Casing casing = Casing.Upper)
45 {
46 uint num = (uint)(((value & 0xF0) << 4) + (value & 0xF) - 35209);
47 uint num2 = ((((0 - num) & 0x7070) >> 4) + num + 47545) | (uint)casing;
48 buffer[startingIndex + 1] = (byte)num2;
49 buffer[startingIndex] = (byte)(num2 >> 8);
50 }
51
52 [MethodImpl(MethodImplOptions.AggressiveInlining)]
53 public static void ToCharsBuffer(byte value, Span<char> buffer, int startingIndex = 0, Casing casing = Casing.Upper)
54 {
55 uint num = (uint)(((value & 0xF0) << 4) + (value & 0xF) - 35209);
56 uint num2 = ((((0 - num) & 0x7070) >> 4) + num + 47545) | (uint)casing;
57 buffer[startingIndex + 1] = (char)(num2 & 0xFFu);
58 buffer[startingIndex] = (char)(num2 >> 8);
59 }
60
61 public static void EncodeToUtf16(ReadOnlySpan<byte> bytes, Span<char> chars, Casing casing = Casing.Upper)
62 {
63 for (int i = 0; i < bytes.Length; i++)
64 {
65 ToCharsBuffer(bytes[i], chars, i * 2, casing);
66 }
67 }
68
69 public unsafe static string ToString(ReadOnlySpan<byte> bytes, Casing casing = Casing.Upper)
70 {
71 fixed (byte* ptr = bytes)
72 {
73 return string.Create(bytes.Length * 2, ((IntPtr)ptr, bytes.Length, casing), delegate(Span<char> chars, (IntPtr Ptr, int Length, Casing casing) args)
74 {
75 ReadOnlySpan<byte> bytes2 = new ReadOnlySpan<byte>((void*)args.Ptr, args.Length);
76 EncodeToUtf16(bytes2, chars, args.casing);
77 });
78 }
79 }
80
81 [MethodImpl(MethodImplOptions.AggressiveInlining)]
82 public static char ToCharUpper(int value)
83 {
84 value &= 0xF;
85 value += 48;
86 if (value > 57)
87 {
88 value += 7;
89 }
90 return (char)value;
91 }
92
93 [MethodImpl(MethodImplOptions.AggressiveInlining)]
94 public static char ToCharLower(int value)
95 {
96 value &= 0xF;
97 value += 48;
98 if (value > 57)
99 {
100 value += 39;
101 }
102 return (char)value;
103 }
104
106 {
107 int charsProcessed;
108 return TryDecodeFromUtf16(chars, bytes, out charsProcessed);
109 }
110
111 public static bool TryDecodeFromUtf16(ReadOnlySpan<char> chars, Span<byte> bytes, out int charsProcessed)
112 {
113 int num = 0;
114 int num2 = 0;
115 int num3 = 0;
116 int num4 = 0;
117 while (num2 < bytes.Length)
118 {
119 num3 = FromChar(chars[num + 1]);
120 num4 = FromChar(chars[num]);
121 if ((num3 | num4) == 255)
122 {
123 break;
124 }
125 bytes[num2++] = (byte)((num4 << 4) | num3);
126 num += 2;
127 }
128 if (num3 == 255)
129 {
130 num++;
131 }
132 charsProcessed = num;
133 return (num3 | num4) != 255;
134 }
135
136 [MethodImpl(MethodImplOptions.AggressiveInlining)]
137 public static int FromChar(int c)
138 {
139 if (c < CharToHexLookup.Length)
140 {
141 return CharToHexLookup[c];
142 }
143 return 255;
144 }
145
146 [MethodImpl(MethodImplOptions.AggressiveInlining)]
147 public static int FromUpperChar(int c)
148 {
149 if (c <= 71)
150 {
151 return CharToHexLookup[c];
152 }
153 return 255;
154 }
155
156 [MethodImpl(MethodImplOptions.AggressiveInlining)]
157 public static int FromLowerChar(int c)
158 {
159 switch (c)
160 {
161 case 48:
162 case 49:
163 case 50:
164 case 51:
165 case 52:
166 case 53:
167 case 54:
168 case 55:
169 case 56:
170 case 57:
171 return c - 48;
172 case 97:
173 case 98:
174 case 99:
175 case 100:
176 case 101:
177 case 102:
178 return c - 97 + 10;
179 default:
180 return 255;
181 }
182 }
183
184 [MethodImpl(MethodImplOptions.AggressiveInlining)]
185 public static bool IsHexChar(int c)
186 {
187 if (IntPtr.Size == 8)
188 {
189 ulong num = (uint)(c - 48);
190 ulong num2 = (ulong)(-17875860044349952L << (int)num);
191 ulong num3 = num - 64;
192 if ((long)(num2 & num3) >= 0L)
193 {
194 return false;
195 }
196 return true;
197 }
198 return FromChar(c) != 255;
199 }
200
201 [MethodImpl(MethodImplOptions.AggressiveInlining)]
202 public static bool IsHexUpperChar(int c)
203 {
204 if ((uint)(c - 48) > 9u)
205 {
206 return (uint)(c - 65) <= 5u;
207 }
208 return true;
209 }
210
211 [MethodImpl(MethodImplOptions.AggressiveInlining)]
212 public static bool IsHexLowerChar(int c)
213 {
214 if ((uint)(c - 48) > 9u)
215 {
216 return (uint)(c - 97) <= 5u;
217 }
218 return true;
219 }
220}
static void EncodeToUtf16(ReadOnlySpan< byte > bytes, Span< char > chars, Casing casing=Casing.Upper)
static int FromLowerChar(int c)
static bool IsHexLowerChar(int c)
static void ToCharsBuffer(byte value, Span< char > buffer, int startingIndex=0, Casing casing=Casing.Upper)
static int FromUpperChar(int c)
static char ToCharLower(int value)
static ReadOnlySpan< byte > CharToHexLookup
static bool TryDecodeFromUtf16(ReadOnlySpan< char > chars, Span< byte > bytes)
static bool IsHexChar(int c)
static bool TryDecodeFromUtf16(ReadOnlySpan< char > chars, Span< byte > bytes, out int charsProcessed)
static int FromChar(int c)
static char ToCharUpper(int value)
static void ToBytesBuffer(byte value, Span< byte > buffer, int startingIndex=0, Casing casing=Casing.Upper)
static unsafe string ToString(ReadOnlySpan< byte > bytes, Casing casing=Casing.Upper)
static bool IsHexUpperChar(int c)
static int Size
Definition IntPtr.cs:21