Hex Editor: Speedup FindPrev/FindNext

This commit is contained in:
Isotarge 2018-03-19 00:56:36 +10:30
parent 549b484c21
commit b28d159023
1 changed files with 37 additions and 8 deletions

View File

@ -235,6 +235,28 @@ namespace BizHawk.Client.EmuHawk
return str.Select(Convert.ToByte).ToArray(); return str.Select(Convert.ToByte).ToArray();
} }
public byte[] ConvertHexStringToByteArray(string str)
{
if (string.IsNullOrWhiteSpace(str)) {
return new byte[0];
}
// TODO: Better method of handling this?
if (str.Length % 2 == 1)
{
str += "0";
}
byte[] bytes = new byte[str.Length / 2];
for (int i = 0; i < str.Length; i += 2)
{
bytes[i / 2] = Convert.ToByte(str.Substring(i, 2), 16);
}
return bytes;
}
public void FindNext(string value, bool wrap) public void FindNext(string value, bool wrap)
{ {
long found = -1; long found = -1;
@ -261,16 +283,20 @@ namespace BizHawk.Client.EmuHawk
startByte = _addressHighlighted + DataSize; startByte = _addressHighlighted + DataSize;
} }
byte[] searchBytes = ConvertHexStringToByteArray(search);
for (var i = startByte; i < (_domain.Size - numByte); i++) for (var i = startByte; i < (_domain.Size - numByte); i++)
{ {
var ramblock = new StringBuilder(); bool differenceFound = false;
for (var j = 0; j < numByte; j++) for (var j = 0; j < numByte; j++)
{ {
ramblock.Append(string.Format("{0:X2}", (int)_domain.PeekByte(i + j))); if (_domain.PeekByte(i + j) != searchBytes[j])
{
differenceFound = true;
break;
}
} }
var block = ramblock.ToString().ToUpper(); if (!differenceFound)
if (search == block)
{ {
found = i; found = i;
break; break;
@ -313,16 +339,19 @@ namespace BizHawk.Client.EmuHawk
startByte = _addressHighlighted - 1; startByte = _addressHighlighted - 1;
} }
byte[] searchBytes = ConvertHexStringToByteArray(search);
for (var i = startByte; i >= 0; i--) for (var i = startByte; i >= 0; i--)
{ {
var ramblock = new StringBuilder(); bool differenceFound = false;
for (var j = 0; j < numByte; j++) for (var j = 0; j < numByte; j++)
{ {
ramblock.Append(string.Format("{0:X2}", (int)_domain.PeekByte(i + j))); if (_domain.PeekByte(i + j) != searchBytes[j]) {
differenceFound = true;
break;
}
} }
var block = ramblock.ToString().ToUpper(); if (!differenceFound)
if (search == block)
{ {
found = i; found = i;
break; break;