簡體   English   中英

C#讀取文件和編碼問題

[英]C# Reading files and encoding issue

我到處都在尋找這個答案,因此希望它不會重復。 我決定終於要在這里問了。

我有一個名為Program1.exe的文件,當我將該文件拖到Notepad或Notepad ++中時,會得到各種隨機符號,然后是一些可讀的文本。 但是,當我嘗試使用C#讀取此文件時,我得到的結果不准確,或者只是一個很大的MZ。 我已經嘗試了C#中所有受支持的編碼。 記事本程序如何讀取這樣的文件,但是我卻無法讀取? 我嘗試將字節轉換為字符串,但不起作用。 我嘗試直接逐行讀取,但它不起作用。 我什至嘗試過二進制,但是它不起作用。

謝謝您的幫助! :)

讀取二進制文件作為文本是一件奇怪的事情,但是有可能。 任何8位編碼都可以。 例如,下面的代碼打開並讀取可執行文件,並將其輸出到控制台。

const string fname = @"C:\mystuff\program.exe";
using (var sw = new StreamReader(fname, Encoding.GetEncoding("windows-1252")))
{
    var s = sw.ReadToEnd();
    s = s.Replace('\x0', ' '); // replace NUL bytes with spaces
    Console.WriteLine(s);
}

結果與在Notepad或Notepad ++中看到的非常相似。 根據控制台的配置,“有趣的符號”會有所不同,但是您可以理解。

順便說一句,如果您在調試器中檢查字符串,將會看到完全不同的東西。 這些有趣的符號被編碼為C#字符轉義符。 例如,nul字節(值0)在調試器中顯示為\\0 ,在Notepad ++中顯示為NUL ,在控制台或記事本中顯示為空格。 換行符在調試器等中顯示為\\r

正如我所說,將二進制文件讀取為文本是非常特殊的。 除非您只是想查看文件中是否存在人類可讀的數據,否則我無法想象您為什么要這樣做。

更新資料

我懷疑您在Windows窗體文本框中看到的全部是“ MZ”的原因是Windows文本框控件(文本框最終使用的控件)使用NUL字符作為字符串終止符,因此在首先是NUL “ MZ”之后的第一件事是NUL (在調試器中顯示為“ \\ 0”)。 您必須用空格替換字符串中的0。 我編輯了上面的代碼示例,顯示了您將如何執行此操作。

exe是一個二進制文件,如果您嘗試將其作為文本文件讀取,將獲得您所描述的效果。 嘗試使用諸如FileStream之類的東西,該東西不關心文件的結構,而是將其視為一系列字節。

暫無
暫無

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

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