我如何搜索指定的字节数组并替换从开始到此字节数组(包括)的所有内容
基本上我有我要寻找的模式
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
数组的所有字节,然后用我的{ {1}}数组。
该文件可能很大,但是模式始终位于开头(少于500个首字节),并不总是位于相同的偏移量,并且只能找到一次。
我已经尝试过rene的代码here,但是它什么也没做。 我也从OpenFileDialog获取文件并读取其字节
ddsHeaderDXT1
答案 0 :(得分:0)
以下应该可以解决问题:
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;
}
易于阅读,因此易于理解。无论如何,它都不是最快的解决方案,但是事情的速度必须和您需要的一样快,而不是更快。
如果您需要更高效的实现,则可以从此处进行优化。