[英]C# Binary Search + Replace
我如何搜索指定的字节数组并替换从开始到此字节数组(包括在内)的所有内容
基本上我有我的模式可以找到
byte[] find = { 0x00, 0x48, 0x00 };
和
byte[] ddsHeaderDXT1 = { 0x44, 0x44, 0x53, 0x20, 0x7C, 0x00, 0x00, 0x00, 0x07, 0x10, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x56, 0x54, 0x54, 0x06, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x54, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 };
我想做的就是搜索我的find
数组,一旦find
它,选择从文件开头到包含的这个find
数组的所有字节,然后用ddsHeaderDXT1
数组替换所有这些ddsHeaderDXT1
。 该文件可能很大,但是模式始终位于开头(少于500个首字节),并不总是位于相同的偏移量,只能找到一次。
我已经在这里尝试过rene的代码,但是它什么也没做。 我也从OpenFileDialog获取文件并读取其字节
byte[] src = File.ReadAllBytes(ofdFilePath);
以下应该可以解决问题:
public static bool TryFindAndReplace<T>(
T[] source,
T[] pattern,
T[] replacement,
out T[] newArray)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
if (pattern == null)
throw new ArgumentNullException(nameof(pattern));
if (replacement == null)
throw new ArgumentNullException(nameof(replacement));
newArray = null;
if (pattern.Length > source.Length)
return false;
for (var start = 0;
start < source.Length - pattern.Length + 1;
start += 1)
{
var segment = new ArraySegment<T>(source, start, pattern.Length);
if (Enumerable.SequenceEqual(segment, pattern))
{
newArray = replacement.Concat(source.Skip(start + pattern.Length))
.ToArray();
return true;
}
}
return false;
}
易于阅读,因此易于理解。 无论如何,它都不是最快的解决方案,但是事情的速度必须和您需要的一样快,而不是更快。
如果您需要性能更高的实现,则可以从此处进行优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.