Entwickler-Ecke

IO, XML und Registry - Probleme beim einlesen einer hex-Datei mit dem TextReader


d5wag3 - Do 03.03.11 17:34
Titel: Probleme beim einlesen einer hex-Datei mit dem TextReader
Hallo,

ich habe eine Datei, in der hexadezimalwerte gespeichert sind (Bsp. folgt) Diese möchte ich gern auslesen, soweit so gut, jedoch scheint es beim auslesen immer wieder zu Fehlern zu kommen, da nicht korrekt ausgelesen wird was in der Datei an dieser Stelle steht. Es wird einfach dur ein anderes zeichen ersetzt. Die Zeichen die ersetzt werden schein willkürlich zu sein, jeddenfalls konnte ich kein Muster entdecken, werden aber immer durch das gleche Zeichen ersetzt.

Beispiel(Inhalt ist hexadezimal):
In der Datei steht: 0f 00 c0 02 00 65 10 80 80 00 14 2d 31 dd 74 70 ...
eingelesen wird aber: 0f 00 3f 02 00 65 10 3f 3f 00 14 2d 31 3f 74 70 ...

Hier sieht man das einige Werte einfach durch "3f" ersetzt werden. Ich habe etwas mit dem Encoding (utf-8) rumgespielt aber auch das hat das Problem nicht gelöst, dann wurde einfach durch 0xfffd (unter utf-8) ersetzt.

Anbei noch die Codepassage:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
            public CCSDS(string _fullFilename)
            {
                char[] primH = new char[6];
                char[] secH = new char[10];
                char[] zaehlV = new char[13];

                FileStream fs = new FileStream(_fullFilename, FileMode.Open, FileAccess.Read);
                TextReader tr = new StreamReader(fs, System.Text.Encoding.ASCII);

                for (int i = 0; i < 6; i++ )
                {
                    int hex;
                    if ((hex = tr.Read()) != -1)
                    {
                        primH[i] = Convert.ToChar(hex);
                    }
                }

                for (int i = 0; i < 10; i++)
                {
                    int hex;
                    if ((hex = tr.Read()) != -1)
                    {
                        secH[i] = Convert.ToChar(hex);
                    }
                }

                for (int i = 0; i < 13; i++)
                {
                    int hex;
                    if ((hex = tr.Read()) != -1)
                    {
                        zaehlV[i] = Convert.ToChar(hex);
                    }
                }
                tr.Close();
            }

Hat jemand eine Idee warumm nicht korrekt 1:1 das ausgelesen wird, was in der Datei steht. sondern scheinbar willkürlich Werte durch etwas anderes ersetzt werden?

Moderiert von user profile iconKha: C#-Tags hinzugefügt


Kha - Do 03.03.11 18:08

:welcome: in der EE!

Eine Binärdatei als Text zu behandeln ist keine gute Idee. Arbeite einfach direkt mit dem Stream-Objekt.


d5wag3 - Fr 04.03.11 12:09

Danke für deinen Tipp! Ich benutze jetzt den BinaryReader und damit klappt es problemlos.
Anbei der geänderte Code:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
            public CCSDS(string _fullFilename)
            {
                char[] primH = new char[6];
                char[] secH = new char[10];
                char[] zaehlV = new char[13];

                FileStream fs = new FileStream(_fullFilename, FileMode.Open, FileAccess.Read);
                BinaryReader tr = new BinaryReader(fs);

                for (int i = 0; i < 6; i++ )
                {
                    int hex;
                    if ((hex = tr.ReadByte()) != -1)
                    {
                        primH[i] = Convert.ToChar(hex);
                    }
                }

                for (int i = 0; i < 10; i++)
                {
                    int hex;
                    if ((hex = tr.ReadByte()) != -1)
                    {
                        secH[i] = Convert.ToChar(hex);
                    }
                }

                for (int i = 0; i < 13; i++)
                {
                    int hex;
                    if ((hex = tr.ReadByte()) != -1)
                    {
                        zaehlV[i] = Convert.ToChar(hex);
                    }
                }
                tr.Close();

            }


Moderiert von user profile iconKha: C#-Tags hinzugefügt