2015-01-21 3 views
1

Я пытался заставить свою программу заменить unicode в двоичном файле. Пользователь вводит то, что нужно найти, и программа найдет и заменит его на определенную строку, если она сможет ее найти.Как заменить строку unicode в двоичном файле?

Я искал вокруг, но ничего не могу найти мои конкретики, что я хотел бы что-то вроде:

string text = File.ReadAllText(path, Encoding.Unicode); 
text = text.Replace(userInput, specificString); 
File.WriteAllText(path, text); 

, но все, что работает аналогичным образом, должно хватить. Использование этого результата приводит к тому, что файл больше и не используется.

Я использую:

int var = File.ReadAllText(path, Encoding.Unicode).Contains(userInput) ? 1 : 0; 
if (var == 1) 
{ 
    //Missing Part 
} 

для проверки, если файл содержит введенный пользователем строку, если это имеет значение.

+0

Вне темы, но я должен спросить, почему вы создаете тройной оператор для создания второго сравнения? – Sayse

+0

Это ваша единственная проблема, что вы должны прочитать весь файл в памяти. Или есть другие проблемы? –

+2

Это почти невозможно. Бинарный файл может быть защищен контрольной суммой/хэшем. – Henrik

ответ

1

Это может работать только в очень ограниченных ситуациях. К сожалению, вы не представили достаточно подробностей о характере двоичного файла, чтобы кто-нибудь знал, будет ли это работать в вашей ситуации или нет. Существует практически бесконечное разнообразие форматов двоичных файлов, по крайней мере некоторые из которых будут отображаться недействительными, если вы измените один байт, многие из которых могут быть отображены недействительными, если длина файла изменится (т.е. данные после точки вставки уже не там, где ожидается).

Конечно, многие двоичные файлы также являются зашифрованными, сжатыми или и тем, и другим. В таких случаях, даже если вы каким-то чудом найдете текст, который вы ищете, он, вероятно, фактически не представляет этот текст, и его изменение сделает файл непригодным.

Все, что сказано, ради аргумента давайте предположим, что ваш сценарий не имеет ни одной из этих проблем, и совершенно нормально полностью заменить какой-либо текст, найденный в середине файла, с каким-то совершенно другим текстом.

Обратите внимание, что нам также необходимо сделать предположение о кодировке текста. Текст может быть представлен самыми различными способами, и вам нужно будет использовать правильную кодировку не только для поиска текста, но и для обеспечения того, чтобы текст замены был действительным. Для аргумента, скажем, ваш текст закодирован как UTF8.

Теперь у нас есть все, что нужно:

void ReplaceTextInFile(string fileName, string oldText, string newText) 
{ 
    byte[] fileBytes = File.ReadAllBytes(fileName), 
     oldBytes = Encoding.UTF8.GetBytes(oldText), 
     newBytes = Encoding.UTF8.GetBytes(newText); 

    int index = IndexOfBytes(fileBytes, oldBytes); 

    if (index < 0) 
    { 
     // Text was not found 
     return; 
    } 

    byte[] newFileBytes = 
     new byte[fileBytes.Length + newBytes.Length - oldBytes.Length]; 

    Buffer.BlockCopy(fileBytes, 0, newFileBytes, 0, index); 
    Buffer.BlockCopy(newBytes, 0, newFileBytes, index, newBytes.Length); 
    Buffer.BlockCopy(fileBytes, index + oldBytes.Length, 
     newFileBytes, index + newBytes.Length, 
     fileBytes.Length - index - oldBytes.Length); 

    File.WriteAllBytes(filename, newFileBytes); 
} 

int IndexOfBytes(byte[] searchBuffer, byte[] bytesToFind) 
{ 
    for (int i = 0; i < searchBuffer.Length - bytesToFind.Length; i++) 
    { 
     bool success = true; 

     for (int j = 0; j < bytesToFind.Length; j++) 
     { 
      if (searchBuffer[i + j] != bytesToFind[j]) 
      { 
       success = false; 
       break; 
      } 
     } 

     if (success) 
     { 
      return i; 
     } 
    } 

    return -1; 
} 

Примечания:

  • выше является разрушительным. Вы можете запустить его только на копии файла или предпочесть изменить код, чтобы он принял параметр добавления, указывающий новый файл, на который должна быть записана модификация.
  • Эта реализация делает все в памяти. Это гораздо удобнее, но если вы имеете дело с большими файлами, и особенно если вы находитесь на 32-битной платформе, вы можете обнаружить, что вам нужно обработать файл в меньших частях.
+0

Отлично, только то, что мне нужно! – salle55

Смежные вопросы