Forum: PC-Programmierung Intel-Hex in .NET einlesen.


von crazy horse (Gast)


Lesenswert?

Irgendwie steh ich auf dem Schlauch...
Will eine Intel-Hex-Datei einlesen, und hab das dann auch in einem 
String stehen.
Original:
:1000000030303030305AFF10863133303930325A88
txt:
584948484848484848514851485148514851485365707049485654514951515148515751 
485150536556561310
passt ja auch - nur wie mach ich daraus richtige Zahlen?


Sub Cmd1loadClick(ByVal sender As Object, ByVal e As EventArgs)
  Dim myStream as IO.Stream, txt as String, i as Integer
  openFileDialog1.DefaultExt = "hex"
        openFileDialog1.Filter = "Hex files (*.hex)|*.hex"
  openFileDialog1.Title = "Datei Laden ..."
  openFileDialog1.FileName = ""
  If openFileDialog1.ShowDialog() = DialogResult.OK Then

          myStream = openFileDialog1.OpenFile()
          txt=""
          For i=0 To myStream.Length
                 txt = txt &(myStream.Readbyte)
          Next i
          myStream.Close()

  End If
End Sub

von juppi (Gast)


Lesenswert?

hallo crazy horse


versuche das mal!



    'Datei lesen
    Private Sub lesen()
        Dim FiStr As FileStream = _
                  New FileStream("c:\hextest.txt", FileMode.Open)
        Dim StrRe As StreamReader = New StreamReader(FiStr)


        MessageBox.Show(StrRe.ReadLine)

        StrRe.Close()
    End Sub

von spacedog (Gast)


Lesenswert?

In .NET kann man sowas nicht.

von Christian R. (supachris)


Lesenswert?

spacedog wrote:
> In .NET kann man sowas nicht.

Hast du heute deinen .NET-Hass-Tag?

von crazy horse (Gast)


Lesenswert?

hm, das hilft mir nicht wirklich weiter...
Keiner ne Idee? Glaub ich nicht.

von Bri (Gast)


Lesenswert?

Du willst die einzelnen Bytes in ein Byte Array einlesen, oder?

Wenn ja, dann lies einfach eine Zeile ein, kopiere jeweils 2 Ziffern (in 
Hex Darstellung ein Byte) in einen String (substring?) und wandle den 
mit Convert.ToInt32() mit Basis 16 in eine Zahl um.

von juppi (Gast)


Lesenswert?

:1000000030303030305AFF10863133303930325A88

soll das wieder im String txt stehen

von Christian R. (supachris)


Lesenswert?

Naja, da gehört ja bissl mehr Gehirnschmalz dazu, als einfach einlesen. 
Man muss ja Zieladresse, Länge der Zeile, Record-Type, Checksumme usw, 
beachten. Ist aber in jeder programmiersprache machbar. Eine fertige 
Funktion oder Klasse kenn ich aber auch nicht. Vielleicht findest du 
hier die passenden Denkanstöße: 
http://alumni.media.mit.edu/~deva/software/HexFileParser.java

von STK500-Besitzer (Gast)


Lesenswert?

>Original:
>:1000000030303030305AFF10863133303930325A88
>txt:
>58494848484848484851485148514851485148536570704948565451495151514851575 
1485150536556561310
>passt ja auch - nur wie mach ich daraus richtige Zahlen?

Jetzt (nach fünf- oder sechsmaligen Durchlesen...) habe ich auch 
verstanden, was die Zahlen ausdrücken: Das sind die ASCII-Werte.
Zahlen zwischen 48 und 57 sind die Ziffern zwischen 0 und 9,
Zahlen zwischen 65 und 70 die Buchstaben "A" bis "F".

Zum Wandeln wirst du wohl eine Statemachine brauchen, da ja immer eine 
bestimmte Menge Zeichen eine bestimmte Hex-Zahl darstellt 
(Intel-Hex-Format zerlegen...).
Sollte aber nichts aufwändiges sein.

von crazy horse (Gast)


Lesenswert?

Ja, mit den Ascii-Werten ist klar, ich dachte, das wäre ersichtlich.
Das eintüten schaffe ich dann schon, obwohl PC-Programmierung nicht 
gerade mein Steckenpferd ist :-)
Ich scheitere einfach an der Umwandlung Ascii-> reale Zahl.
Selbst wenn ich die Hexwerte A..F erstmal aussen vor lasse:
Warum funktioniert selbst folgendes einfaches nicht:
ByteAnzahl=(val(txt(2))*10 + val(txt(3))-48)*16 'Anzahl der Datenbytes 
im record high

Fehlermeldung:
Ausnahme System.IndexOutOfRangeException wurde im ausgeführten Programm 
ausgelöst:
Der Index war außerhalb des Arraybereichs.

Weiter ratlos...

von crazy horse (Gast)


Lesenswert?

Und was ich wirklich will:

Anzahl der Datenbytes in diesem record (0...16)
Startadresse dieser Daten   (nur 64k-Modus, also 0..65535)
Recordtyp  (es kommt nur 00 oder 01 vor)
Daten in einem Feld  (max. 16 Bytes)
CRC

von crazy horse (Gast)


Lesenswert?

Das kann eigentlich gar nicht schwer sein, aber ich sitze jetzt schon 2 
Tage an dieser jämmerlichen Umwandlung und komme kein Stück weiter.
Die Anzahl meiner grauen Haare hat sich verdoppelt :-)

von F. T. (acerpower)


Lesenswert?

Beschreibe dein Problem ausfühlicher, dann kann dir jemand helfen!
Zur Zeit verstehe ich nur Bahnhof!

von Christian R. (supachris)


Lesenswert?

Muss es denn unbedingt sowas schreckliches wie Visual Basic sein? In 
C/C++ wäre das mit sscanf usw. leicht machbar.

von crazy horse (Gast)


Lesenswert?

Ich weiss nicht, was ich genauer beschreiben sollte...
.net muss es sein, der Rest ist fertig, nur der dämliche Mist klemmt.

von Mars (Gast)


Lesenswert?

Hi!

So schwer kann dass doch nicht sein!
1
Dim s As String = "1234567890ABCDEF"
2
Dim b As Byte = Convert.ToByte(s.Substring(10, 2), 16)
3
' b = 0xAB

lg

von Christian R. (supachris)


Lesenswert?

Weobei .NET ja nicht nur aus VB besteht. zum Glück gibts da noch C#. 
Aber gut, ist Haarspalterei.

von Roland (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mal irgendwo einen AVR Bootloader in C#.NET gefunden. Könntest 
davon die Klasse Hexfile für dich verwenden. Einfach Objekt erstellen 
und mit der Methode LoadFile die Datei einlesen. Schon stehen dir alle 
Informationen der Hexfile in deinem Programm zur verfügung.

Gruß

Roland

von Arc N. (arc)


Lesenswert?

1
byte hexStrToByte(string s, int offset) {
2
    // Umwandlung zu Fuß oder z.B. so
3
    return Convert.ToByte(s.SubString(offset, 2), 16);
4
}
5
6
UInt16 hexStrToUInt16(string s, int offset) {
7
    ...
8
}
9
10
void ReadHexFile(string fileName) {
11
    string[] hexLines = File.ReadAllLines(fileName);
12
    byte[] bytes = new byte[256 + 1];
13
    byte len;
14
    UInt16 addr;
15
    byte type;
16
    int byteIdx;
17
    byte crc;
18
19
    foreach (string s in hexLines) {
20
        if (s[0] != ':') break;
21
        if (s.Length < 11) break;
22
        len = hexStrToByte(s, 1);
23
        addr = hexStrToUInt(s, 3);
24
        type = hexStrToByte(s, 7);
25
        byteIdx = 0;
26
        // keine Tests auf Länge und byteIdx! 
27
        for (int i = 9; i < s.Length; i += 2) {
28
            bytes[byteIdx] = hexStrToByte(s, i);
29
            byteIdx++;
30
        }
31
        if (byteIdx > 0) crc = bytes[byteIdx - 1];
32
        // ...
33
    }
34
}

von crazy horse (Gast)


Lesenswert?

So, nun hammers....

  Sub Cmd1loadClick(ByVal sender As Object, ByVal e As EventArgs)
    Dim  txt as String, test as String, i as Integer
      Dim Adresse As Integer
      Dim DateiNr As Integer
      Dim  k As Integer

    openFileDialog1.DefaultExt = "hex"
        openFileDialog1.Filter = "Hex files (*.hex)|*.hex"
    openFileDialog1.Title = "Datei Laden ..."
    openFileDialog1.FileName = ""
    If openFileDialog1.ShowDialog() = DialogResult.OK Then
        DateiNr=Freefile
      FileOpen(DateiNr, openFileDialog1.FileName, OpenMode.Input)
      do while not EOF (DateiNr)
        txt =LineInput(DateiNr)
        test=mid(txt,2,2)  'Anzahl Datenbytes
        k=byte.Parse(test, Globalization.NumberStyles.HexNumber)
          test=mid(txt,4,4)  'Adresse
        Adresse=Integer.Parse(test, 
Globalization.NumberStyles.HexNumber)
        if k>0 Then
          For i=10 To k*2+9 step 2
                  test=mid(txt,i,2)

                  EEpromBuffer(Adresse)=byte.Parse(test, 
Globalization.NumberStyles.HexNumber)
                  'CRC_calc=CRC_calc+EEpromBuffer(i)
                  Adresse=Adresse+1
                Next i
                test=mid(txt,i,2)
                'CRC_rec
            End If
         loop

         FileClose(DateiNr)
    End If
  End Sub


Hauptsächliche Änderung: nicht mit I/O-Stream arbeiten sonern mit dem 
guten alten LineInput. Dann habe ich direkt den String Zeile für Zeile 
und kann den zerpflücken.
CRC fehlt zwar noch, aber es funktioniert wenigstens erst mal :-)
Vielen Dank an alle.

von Sebastian____ (Gast)


Lesenswert?

bei den stream bzw. mit einem STreamreader gibt es auch ein "Readline".

von juppi (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.