mikrocontroller.net

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


Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spacedog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In .NET kann man sowas nicht.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spacedog wrote:
> In .NET kann man sowas nicht.

Hast du heute deinen .NET-Hass-Tag?

Autor: crazy horse (Gast)
Datum:

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

Autor: Bri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:1000000030303030305AFF10863133303930325A88

soll das wieder im String txt stehen

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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/HexFile...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: F. Tschurtschenthaler (acerpower)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

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

lg

Autor: Christian R. (supachris)
Datum:

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

Autor: Roland (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
byte hexStrToByte(string s, int offset) {
    // Umwandlung zu Fuß oder z.B. so
    return Convert.ToByte(s.SubString(offset, 2), 16);
}

UInt16 hexStrToUInt16(string s, int offset) {
    ...
}

void ReadHexFile(string fileName) {
    string[] hexLines = File.ReadAllLines(fileName);
    byte[] bytes = new byte[256 + 1];
    byte len;
    UInt16 addr;
    byte type;
    int byteIdx;
    byte crc;

    foreach (string s in hexLines) {
        if (s[0] != ':') break;
        if (s.Length < 11) break;
        len = hexStrToByte(s, 1);
        addr = hexStrToUInt(s, 3);
        type = hexStrToByte(s, 7);
        byteIdx = 0;
        // keine Tests auf Länge und byteIdx! 
        for (int i = 9; i < s.Length; i += 2) {
            bytes[byteIdx] = hexStrToByte(s, i);
            byteIdx++;
        }
        if (byteIdx > 0) crc = bytes[byteIdx - 1];
        // ...
    }
}

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian____ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei den stream bzw. mit einem STreamreader gibt es auch ein "Readline".

Autor: juppi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.