我正在从二进制文件中读取字符串。每个字符串都是空终止的。编码是UTF-8。在python中,我只是读取一个字节,检查它是否为0,将它附加到一个字节数组,然后继续读取字节,直到看到一个0.然后,我将字节数组转换为一个字符串并继续前进。所有的字符串都被正确读取。读取以空字符结尾的字符串
如何在C#中读取此内容?因为数组的大小是固定的,所以我不认为我有将字节附加到数组的优点。
我正在从二进制文件中读取字符串。每个字符串都是空终止的。编码是UTF-8。在python中,我只是读取一个字节,检查它是否为0,将它附加到一个字节数组,然后继续读取字节,直到看到一个0.然后,我将字节数组转换为一个字符串并继续前进。所有的字符串都被正确读取。读取以空字符结尾的字符串
如何在C#中读取此内容?因为数组的大小是固定的,所以我不认为我有将字节附加到数组的优点。
您可以使用一个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();
-1:StringBuilder不会[附加](http://msdn.microsoft.com/zh-cn/library/86yy043k.aspx)该字节的字符值,而是该字节的整数值。 – Virtlink 2014-04-19 08:50:05
下面应该得到你所期待的。所有的文本应该在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;
}
}
这应该是答案 – 2017-07-19 17:11:26
我假设你正在使用一个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);
}
}
为什么不使用列表? –
2012-07-29 23:37:17
为什么不把它们追加到一个字符串作为字符? – zellio 2012-07-29 23:37:53
这会奏效,但会使用比您想象的更多的记忆。 C#字符串是不可变的,所以每次修改时都必须创建一个新字符串。在大多数情况下,额外内存的数量可能不是问题,但最好的方法可能是Mike的建议,具有合理的初始大小。列表仍然只是数组的一个包装,它会在需要时创建更大的数组。 –
TheEvilPenguin
2012-07-29 23:42:03