2016-09-04 27 views
1

我正在製作一個程序,它將在大約186個文件(「4f 4c 44 6f 6f」)中用「4f 4c 52 6f 6f 72」替換「4f 4c 44 6f 6f 72」 72「在每個文件中有多個出現)。替換文件中的字節序列

我已經看到了很多關於如何做到這一點的指南,但它們都需要偏移原始字節的位置,這意味着我需要每個文件大約28個偏移量,這將會花費太長時間...

這樣做的最好方法是什麼?

+1

是偏移固定且已知? 「最差效率」算法將線性遍歷每個文件,找到序列並將其替換。當這可能是一次性操作時,速度真的很重要嗎? –

+0

我可以找出這些偏移量,但這意味着我將不得不尋找約5000個這些,這是一次性的操作,所以速度並不重要 – 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); 
    }