2012-07-29 85 views
5

我正在從二進制文件中讀取字符串。每個字符串都是空終止的。編碼是UTF-8。在python中,我只是讀取一個字節,檢查它是否爲0,將它附加到一個字節數組,然後繼續讀取字節,直到看到一個0.然後,我將字節數組轉換爲一個字符串並繼續前進。所有的字符串都被正確讀取。讀取以空字符結尾的字符串

如何在C#中讀取此內容?因爲數組的大小是固定的,所以我不認爲我有將字節附加到數組的優點。

+1

爲什麼不使用列表? – 2012-07-29 23:37:17

+0

爲什麼不把它們追加到一個字符串作爲字符? – zellio 2012-07-29 23:37:53

+0

這會奏效,但會使用比您想象的更多的記憶。 C#字符串是不可變的,所以每次修改時都必須創建一個新字符串。在大多數情況下,額外內存的數量可能不是問題,但最好的方法可能是Mike的建議,具有合理的初始大小。列表仍然只是數組的一個包裝,它會在需要時創建更大的數組。 – TheEvilPenguin 2012-07-29 23:42:03

回答

4

您可以使用一個List<byte>

List<byte> list = new List<byte>(); 
while(reading){ //or whatever your condition is 
    list.add(readByte); 
} 

string output = Encoding.UTF8.GetString(list.ToArray()); 

或者你可以使用一個StringBuilder

StringBuilder builder = new StringBuilder(); 

while(reading){ 
    builder.Append(readByte); 
} 

string output = builder.ToString(); 
+3

-1:StringBuilder不會[附加](http://msdn.microsoft.com/zh-cn/library/86yy043k.aspx)該字節的字符值,而是該字節的整數值。 – Virtlink 2014-04-19 08:50:05

6

下面應該得到你所期待的。所有的文本應該在myText列表中。

var data = File.ReadAllBytes("myfile.bin"); 
List<string> myText = new List<string>(); 
int lastOffset = 0; 
for (int i = 0; i < data.Length; i++) 
{ 
    if (data[i] == 0) 
    { 
     myText.Add(System.Text.Encoding.UTF8.GetString(data, lastOffset, i - lastOffset)); 
     lastOffset = i + 1; 
    } 
} 
+0

這應該是答案 – 2017-07-19 17:11:26

3

我假設你正在使用一個StreamReader實例:

StringBuilder sb = new StringBuilder(); 
using(StreamReader rdr = OpenReader(...)) { 
    Int32 nc; 
    while((nc = rdr.Read()) != -1) { 
      Char c = (Char)nc; 
      if(c != '\0') sb.Append(c); 
    } 
} 
相關問題