Frage

Ich habe den folgenden Code:

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++;
    }
}

Der Datei_Path ist eine Const -Zeichenfolge, die den Pfad zur gelesenen Binärdatei enthält. Die Binärdatei ist eine Mischung aus Ganzzahlen und Zeichen. Die Ganzzahlen sind 1 Bytes. Jedes Zeichen wird als 2 Bytes in die Datei geschrieben.

Beispielsweise hat die Datei die folgenden Daten:

1HELLO Wie geht es dir?

Bitte beachten Sie: Jede Ganzzahl ist der folgenden Zeichenfolge zugeordnet. Also ist 1 mit "Hallo wie geht es dir" und 45 mit "Du bist gut aussehen" und so weiter.

Jetzt wird die Binärdatei geschrieben (ich weiß nicht warum, aber ich muss damit leben), so dass '1' nur 1 Byte nimmt, während 'H' (und andere Charaktere) jeweils 2 Bytes aufnehmen.

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

0100480045..und auf Heres der Zusammenbruch:

01 ist das erste Byte für die Ganzzahl 1 0048 sind die 2 Bytes für 'H' (H ist 48 in Hex) 0045 sind die 2 Bytes für 'e' (e = 0x45)

Und so weiter .. Ich möchte, dass meine Konsole menschlich lesbares Format aus dieser Datei ausdruckt: Ich möchte, dass sie "1 hallo wie geht es dir" und dann "45 du siehst gut aus" und so weiter ...

Ist was ich richtig mache? Gibt es einen einfacheren/effizienten Weg? Meine Zeilenkonsole.WriteLine (convert.toString (b [pos])); Drucken nichts als den Ganzzahlwert und nicht den tatsächlichen Charakter, den ich will. Für Ganzzahlen in der Datei ist es in Ordnung, aber wie lese ich dann Zeichen vor?

Jede Hilfe wäre sehr geschätzt. Vielen Dank

War es hilfreich?

Lösung

Ich denke, was Sie suchen, ist Coding.getString.

Da Ihre String -Daten aus 2 Byte -Zeichen bestehen, können Sie Ihre Zeichenfolge herausholen, wenn Sie Ihre Zeichenfolge herausholen können:

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++;
  }
}

Andere Tipps

Sie können String system.text.unicodeCoding.getString () verwenden, das ein Byte [] -Array nimmt und eine Zeichenfolge erzeugt.

Ich fand diesen Link sehr nützlich

Beachten Sie, dass dies nicht dasselbe ist, wie es nur blind das Bytes aus dem Byte [] -Array in ein Stück Speicher kopiert und sie als Zeichenfolge nennt. Die GetString () -Methode muss beispielsweise die Bytes validieren und ungültige Ersatzstoffe verbieten.

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));

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top