[英]How can I replace a unicode string in a binary file?
我一直在嘗試讓我的程序替換二進制文件中的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
}
用於檢查文件是否包含用戶輸入的字符串(如果有)。
這只能在非常有限的情況下起作用。 不幸的是,您沒有提供有關二進制文件性質的足夠詳細的信息,任何人都無法知道這是否適合您的情況。 幾乎有各種各樣的二進制文件格式,如果修改單個字節,至少其中一些將變為無效,如果文件長度發生更改(例如,插入點后的數據為不再是預期的位置)。
當然,許多二進制文件也可以加密,壓縮或同時加密和壓縮。 在這種情況下,即使您奇跡般地找到了所要查找的文本,它也可能實際上並不代表該文本,並且對其進行修改將使該文件無法使用。
綜上所述,為了便於討論,我們假設您的方案沒有任何這些問題,並且完全可以用完全不同的文本替換文件中間的某些文本,這是完全可以的。
請注意,我們還需要對文本編碼進行假設。 文本可以用多種方式表示,您不僅需要使用正確的編碼來查找文本,而且還需要確保替換文本有效。 為了便於討論,假設您的文本編碼為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;
}
筆記:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.