mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
92 lines
2.1 KiB
C#
92 lines
2.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Mesen.Debugger.Utilities
|
|
{
|
|
public class HexUtilities
|
|
{
|
|
private static byte[] _hexLookup = new byte[256];
|
|
|
|
static HexUtilities()
|
|
{
|
|
_hexLookup['0'] = 0;
|
|
_hexLookup['1'] = 1;
|
|
_hexLookup['2'] = 2;
|
|
_hexLookup['3'] = 3;
|
|
_hexLookup['4'] = 4;
|
|
_hexLookup['5'] = 5;
|
|
_hexLookup['6'] = 6;
|
|
_hexLookup['7'] = 7;
|
|
_hexLookup['8'] = 8;
|
|
_hexLookup['9'] = 9;
|
|
_hexLookup['a'] = 10;
|
|
_hexLookup['b'] = 11;
|
|
_hexLookup['c'] = 12;
|
|
_hexLookup['d'] = 13;
|
|
_hexLookup['e'] = 14;
|
|
_hexLookup['f'] = 15;
|
|
_hexLookup['A'] = 10;
|
|
_hexLookup['B'] = 11;
|
|
_hexLookup['C'] = 12;
|
|
_hexLookup['D'] = 13;
|
|
_hexLookup['E'] = 14;
|
|
_hexLookup['F'] = 15;
|
|
}
|
|
|
|
public static int FromHex(string hex)
|
|
{
|
|
int value = 0;
|
|
for(int i = 0; i < hex.Length; i++) {
|
|
value <<= 4;
|
|
value |= _hexLookup[hex[i]];
|
|
}
|
|
return value;
|
|
}
|
|
|
|
public static byte[] HexToArray(string hex)
|
|
{
|
|
hex = string.Join("", hex.Split(" ", StringSplitOptions.RemoveEmptyEntries).Select(x => x.Length % 2 == 1 ? ("0" + x) : x));
|
|
byte[] result = new byte[hex.Length / 2];
|
|
for(int i = 0; i < hex.Length; i += 2) {
|
|
byte value = 0;
|
|
value |= _hexLookup[hex[i]];
|
|
value <<= 4;
|
|
value |= _hexLookup[hex[i+1]];
|
|
result[i / 2] = value;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static short[] HexToArrayWithWildcards(string hex)
|
|
{
|
|
string[] sections = hex.Split("?");
|
|
|
|
StringBuilder sb = new();
|
|
for(int i = 0; i < sections.Length; i++) {
|
|
sb.Append(string.Join("", sections[i].Split(" ", StringSplitOptions.RemoveEmptyEntries).Select(x => x.Length % 2 == 1 ? ("0" + x) : x)));
|
|
if(i < sections.Length - 1) {
|
|
sb.Append("??");
|
|
}
|
|
}
|
|
|
|
hex = sb.ToString();
|
|
|
|
short[] result = new short[hex.Length / 2];
|
|
for(int i = 0; i < hex.Length; i += 2) {
|
|
if(hex[i] == '?' && hex[i + 1] == '?') {
|
|
result[i / 2] = -1;
|
|
} else {
|
|
byte value = 0;
|
|
value |= _hexLookup[hex[i]];
|
|
value <<= 4;
|
|
value |= _hexLookup[hex[i + 1]];
|
|
result[i / 2] = value;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
}
|