2012-07-29 129 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); 
    } 
} 
相关问题