簡體   English   中英

如何替換二進制文件中的unicode字符串?

[英]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;
}

筆記:

  • 以上是破壞性的。 您可能只想在文件的副本上運行它,或者更喜歡修改代碼,以便它采用一個附加參數來指定應寫入修改的文件。
  • 此實現在內存中執行所有操作。 這更為方便,但是如果您要處理大文件,尤其是在32位平台上,則可能會發現需要以較小的塊來處理文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM