如何查找和替换文件中的大部分字节?

时间:2016-04-19 21:32:32

标签: c# binary hex byte

我希望找到一个文件中的大部分字节,删除它们然后从旧的字节开始处导入新的大部分字节。

以下是我尝试在C#中重新创建的手动过程的视频,它可能会更好地解释它:https://www.youtube.com/watch?v=_KNx8WTTcVA

我只有C#的基本经验所以我一直在学习,对此的任何帮助都将非常感激!

感谢。

1 个答案:

答案 0 :(得分:1)

参考这个问题: C# Replace bytes in Byte[]

使用以下课程:

public static class BytePatternUtilities
{
    private static int FindBytes(byte[] src, byte[] find)
    {
        int index = -1;
        int matchIndex = 0;
        // handle the complete source array
        for (int i = 0; i < src.Length; i++)
        {
            if (src[i] == find[matchIndex])
            {
                if (matchIndex == (find.Length - 1))
                {
                    index = i - matchIndex;
                    break;
                }
                matchIndex++;
            }
            else
            {
                matchIndex = 0;
            }

        }
        return index;
    }

    public static byte[] ReplaceBytes(byte[] src, byte[] search, byte[] repl)
    {
        byte[] dst = null;
        byte[] temp = null;
        int index = FindBytes(src, search);
        while (index >= 0)
        {
            if (temp == null)
                temp = src;
            else
                temp = dst;

            dst = new byte[temp.Length - search.Length + repl.Length];

            // before found array
            Buffer.BlockCopy(temp, 0, dst, 0, index);
            // repl copy
            Buffer.BlockCopy(repl, 0, dst, index, repl.Length);
            // rest of src array
            Buffer.BlockCopy(
                temp,
                index + search.Length,
                dst,
                index + repl.Length,
                temp.Length - (index + search.Length));


            index = FindBytes(dst, search);
        }
        return dst;
    }
}

用法:

byte[] allBytes = File.ReadAllBytes(@"your source file path");
byte[] oldbytePattern = new byte[]{49, 50};
byte[] newBytePattern = new byte[]{48, 51, 52};
byte[] resultBytes = BytePatternUtilities.ReplaceBytes(allBytes, oldbytePattern, newBytePattern);
File.WriteAllBytes(@"your destination file path", resultBytes)

问题是当文件太大时,则需要“窗口”功能。不要在内存中加载所有字节,因为它会占用很多空间。