2009-08-20 16 views
2

Ich habe den folgenden Code:von Byte Konvertieren von [] zu String

using (BinaryReader br = new BinaryReader(
     File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite))) 
{ 
    int pos = 0; 
    int length = (int) br.BaseStream.Length; 

    while (pos < length) 
    { 
     b[pos] = br.ReadByte(); 
     pos++; 
    } 

    pos = 0; 
    while (pos < length) 
    { 
     Console.WriteLine(Convert.ToString(b[pos])); 
     pos++; 
    } 
} 

Die FILE_PATH ist ein const String, der den Pfad zur Binärdatei enthält gelesen werden. Die Binärdatei ist eine Mischung aus ganzen Zahlen und Zeichen. Die Ganzzahlen sind jeweils 1 Byte und jedes Zeichen wird als 2 Byte in die Datei geschrieben.

Zum Beispiel hat die Datei die folgenden Daten:

1HELLO HOW ARE YOU45YOU GROSSER // SUCHEN und so weiter

Bitte beachten Sie: Jede ganze Zahl ist, die mit der Zeichenfolge danach. Also 1 steht in Verbindung mit "HALLO WIE SIE SIND" und 45 mit "SIE SIND GROSS" und so weiter.

Jetzt wird die Binärdatei geschrieben (ich weiß nicht warum, aber ich muss damit leben), so dass '1' nur 1 Byte dauert, während 'H' (und andere Zeichen) jeweils 2 Byte benötigt.

Hier ist also, was die Datei tatsächlich enthält:

0100480045..and usw. Heres des Durchbruch:

01 ist das erste Byte für die ganze Zahl 1 0048 ist die 2 Byte für ‚H "(H 48 in Hex) 0045 sind das 2 Bytes für 'E' (E = 0x45)

und so weiter .. ich mag, dass meine Konsole lesbare Form aus dieser Datei drucken: das mag ich es zu drucken "1 HALLO WIE SIE SIND" und dann "45 SIE SUCHEN GROSS" und so weiter .. .

Was mache ich richtig? Gibt es einen einfacheren/effizienteren Weg? Meine Linie Console.WriteLine (Convert.ToString (b [pos])); tut nichts, aber druckt den ganzzahligen Wert und nicht das tatsächliche Zeichen, das ich will. Es ist OK für ganze Zahlen in der Datei, aber wie lese ich dann Zeichen aus?

Jede Hilfe würde sehr geschätzt werden. Danke

+0

Sprache? – mkoryak

+0

Ich löschte meine Antwort - Was dachte die Person, die sich für dieses Format entschieden hat? : boggled: –

+0

Wie wird das Integer-Feld von der Zeichenfolge unterschieden? Können die Zeichen über dem Codepunkt U + 00FF liegen? Kann die ganze Zahl "0" sein? Ist die ganze Zahl signiert oder unsigniert? – outis

Antwort

8

Ich denke, was Sie suchen, ist Encoding.GetString.

Da Ihre String-Daten besteht aus 2-Byte-Zeichen, wie Sie Ihre Zeichenfolge aus bekommen kann, ist:

for (int i = 0; i < b.Length; i++) 
{ 
    byte curByte = b[i]; 

    // Assuming that the first byte of a 2-byte character sequence will be 0 
    if (curByte != 0) 
    { 
    // This is a 1 byte number 
    Console.WriteLine(Convert.ToString(curByte)); 
    } 
    else 
    { 
    // This is a 2 byte character. Print it out. 
    Console.WriteLine(Encoding.Unicode.GetString(b, i, 2)); 

    // We consumed the next character as well, no need to deal with it 
    // in the next round of the loop. 
    i++; 
    } 
} 
+0

Sie müssen das erste "ID" -Byte separat lesen und dann den Rest der Bytes mit der richtigen Kodierung übersetzen. – tvanfosson

+0

Oh, ich habe diesen Teil der Frage verpasst. Ich werde meine Antwort bearbeiten. – paracycle

+0

Wie bestimmt der Code, wo die erste Zeichenfolge endet? Ohne diese Informationen wissen Sie nicht, wann Sie nach der nächsten Nummer suchen müssen. –

1

Sie können String System.Text.UnicodeEncoding.GetString() verwenden, die ein Byte nimmt [] Array und erzeugt eine Zeichenfolge. I found this link very useful

+0

Sie sollten wirklich eine Zusammenfassung hinzufügen, so dass Ihre Antwort für sich allein stehen kann. Es ist nicht mein Downvote, aber ich kann sicherlich verstehen, warum jemand dachte, es sei nicht hilfreich. – tvanfosson

0
using (BinaryReader br = new BinaryReader(File.Open(FILE_PATH, FileMode.Open, FileAccess.ReadWrite))) 
{  
    int length = (int)br.BaseStream.Length;  

    byte[] buffer = new byte[length * 2]; 
    int bufferPosition = 0; 

    while (pos < length)  
    {   
     byte b = br.ReadByte();   
     if(b < 10) 
     { 
      buffer[bufferPosition] = 0; 
      buffer[bufferPosition + 1] = b + 0x30; 
      pos++; 
     } 
     else 
     { 
      buffer[bufferPosition] = b; 
      buffer[bufferPosition + 1] = br.ReadByte(); 
      pos += 2; 
     } 
     bufferPosition += 2;  
    }  

    Console.WriteLine(System.Text.Encoding.Unicode.GetString(buffer, 0, bufferPosition)); 

}

+1

Ich erhalte die folgenden Compilerfehler, wenn ich versuche, den Code im Zeilenpuffer zu verwenden [bufferPosition + 1] = b + 0x30; : Fehler CS0266: Kann den Typ 'int' nicht implizit in 'Byte' konvertieren. Eine explizite Konvertierung existiert (fehlt Ihnen ein Cast?) – zack

+0

Ich habe auch den Wert der Längenvariable überprüft. Es enthält die Anzahl der Nullen. Ich denke also nicht, dass es nötig ist, es zunächst mit 2 zu multiplizieren, wie Sie es getan haben. – zack

+0

Entschuldigung, ich habe vergessen, den Hex-Wert zu werfen, sollte diese Zeile sein Puffer [BufferPosition + 1] = B + (Byte) 0x30; Sie müssen jedoch die Pufferlänge mit 2 multiplizieren, da sich die Gesamtgröße des Arrays verdoppeln könnte, wenn die gesamte Eingabe Ganzzahlen ist – LorenVS

Verwandte Themen