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
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
spacedog wrote:
> In .NET kann man sowas nicht.
Hast du heute deinen .NET-Hass-Tag?
hm, das hilft mir nicht wirklich weiter... Keiner ne Idee? Glaub ich nicht.
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.
:1000000030303030305AFF10863133303930325A88 soll das wieder im String txt stehen
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
>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.
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...
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
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 :-)
Beschreibe dein Problem ausfühlicher, dann kann dir jemand helfen! Zur Zeit verstehe ich nur Bahnhof!
Muss es denn unbedingt sowas schreckliches wie Visual Basic sein? In C/C++ wäre das mit sscanf usw. leicht machbar.
Ich weiss nicht, was ich genauer beschreiben sollte... .net muss es sein, der Rest ist fertig, nur der dämliche Mist klemmt.
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
Weobei .NET ja nicht nur aus VB besteht. zum Glück gibts da noch C#. Aber gut, ist Haarspalterei.
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
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 | }
|
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.
bei den stream bzw. mit einem STreamreader gibt es auch ein "Readline".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.