繁体   English   中英

C#二进制搜索+替换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM