我正在從二進制文件中讀取字符串。每個字符串都是空終止的。編碼是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