2016-09-04 14 views
1

私は、約186ファイル( "4f 4c 44 6f 6f"に "4f 4c 44 6f 6f 72"を "4f 4c 52 6f 6f 72"に置き換えるためにupkファイルにパッチを適用するプログラムを作成しています72 "は各ファイルに複数の出現があります)。ファイル内の一連のバイトを置換する

私はこれを行う方法について多くのガイドを見てきましたが、元のバイトがどこにあるかというオフセットが必要です。これは、各ファイルに約28のオフセットが必要なことを意味します。

これを行うにはどうすればよいでしょうか?

+1

が固定され、知られてオフセットされていますか? 「最悪の効率」アルゴリズムは、各ファイルを直線的に通過し、シーケンスを見つけて置き換えることである。これが1回限りの操作である場合、スピードは本当に重要ですか? –

+0

私はこれらのオフセットを理解することができましたが、それはそれらの約5000を探す必要があり、速度が重要ではないように1回の操作であることを意味するでしょう – user265889

答えて

1

各ファイルはRAMに合わせて十分に小さいである場合、あなたはそれを・修正して書き戻す、ファイル全体を読んで試すことができます:

private static IEnumerable<int> Offsets(byte[] data, byte[] toFind) { 
    for (int i = 0; i <= data.Length - toFind.Length; ++i) { 
     bool matched = true; 

     for (int j = 0; j < toFind.Length; ++j) 
     if (data[i + j] != toFind[j]) { 
      matched = false; 

      break; 
     } 

     if (matched) 
     yield return i; 
    } 
    } 

    private static void ModifyFile(String path) { 
    byte[] toFind = new byte[] {0x4f, 0x4c, 0x44, 0x6f, 0x6f, 0x72 }; 

    byte[] data = File.ReadAllBytes(path); 

    foreach(var offset in Offsets(data, toFind)) 
     data[offset + 2] = 0x52; // we want just one byte to update 

    File.WriteAllBytes(path, data); 
    } 
関連する問題