2012-07-29 18 views
5

Ich lese Zeichenfolgen aus einer Binärdatei. Jede Zeichenfolge ist nullterminiert. Codierung ist UTF-8. In Python lese ich einfach ein Byte, überprüfe, ob es 0 ist, füge es an ein Byte-Array an und lese weiter, bis ich eine 0 sehe. Dann konvertiere ich das Byte-Array in einen String und gehe weiter. Alle Strings wurden korrekt gelesen.Lesen einer nullterminierten Zeichenfolge

Wie kann ich das in C# lesen? Ich glaube nicht, dass ich den Luxus habe, einfach Bytes an ein Array anzuhängen, da die Arrays eine feste Größe haben.

+1

Warum nicht eine Liste verwenden? –

+0

Warum fügen Sie sie nicht einfach als Zeichen an eine Zeichenkette an? – zellio

+0

Das würde funktionieren, aber mehr Speicher verbrauchen, als Sie denken würden. C# -Zeichenfolgen sind unveränderbar, so dass jedes Mal, wenn Sie eine ändern, eine neue Zeichenfolge erstellt werden muss. Die Menge an zusätzlichem Speicher ist in den meisten Fällen wahrscheinlich kein Problem, aber der beste Weg ist wahrscheinlich Mike's Vorschlag mit einer vernünftigen Anfangsgröße. Die Liste ist immer noch nur ein Wrapper um ein Array, der bei Bedarf größere Arrays erstellt. – TheEvilPenguin

Antwort

4

können Sie entweder ein 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()); 

Oder Sie könnten ein StringBuilder verwenden:

StringBuilder builder = new StringBuilder(); 

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

string output = builder.ToString(); 
+3

-1: Der StringBuilder wird nicht den Zeichenwert des Bytes, sondern den Integer-Wert des Bytes anfügen (http://msdn.microsoft.com/en-us/library/86yy043k.aspx). – Virtlink

6

Nach sollten Sie bekommen, was Sie suchen. Der gesamte Text sollte in meiner Textliste enthalten sein.

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

Dies sollte die Antwort sein –

3

Ich nehme an, Sie ein Stream Beispiel verwenden:

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); 
    } 
} 
Verwandte Themen