Autor Beitrag
d5wag3
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 03.03.11 17:34 
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:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

_________________
>λ=

Für diesen Beitrag haben gedankt: d5wag3
d5wag3 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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:
ausblenden volle Höhe 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