Intel-Hex in .NET einlesen.

Gast #994101
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
Gast #994698
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
Gast #995926
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.
#996001
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
Gast #996002
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.
Gast #996028
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...
Gast #996032
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
Gast #996035
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 :-)
Gast #996106
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
Angehängte Dateien:
#996117
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
}
Gast #996666
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren