Hexdezimale Werte auslesen und übergeben

Hallo liebe Gemeinde,

ich würde gerne eine kleine Applikation schreiben, mit der ich Dateien
zum Eprom brennen erstellen und oder verändern kann.
Die Dateien sind 128kb groß und ich würde gerne jede beliebige Adresse aufufen, den Wert in Hex auslesen, verändern und zurückschreiben können.
Binär ist sowas ja aureichend dokumentiert aber die Adressierung der einzelnen Bytes in Hex macht mir noch Kopfzebrechen als Anfänger.

Vielen lieben Dank schonmal für eure Hilfe!
Michel

Hallo,

ich würde gerne eine kleine Applikation schreiben, mit der ich
Dateien
zum Eprom brennen erstellen und oder verändern kann.
Die Dateien sind 128kb groß und ich würde gerne jede beliebige
Adresse aufufen, den Wert in Hex auslesen, verändern und
zurückschreiben können.
Binär ist sowas ja aureichend dokumentiert aber die
Adressierung der einzelnen Bytes in Hex macht mir noch
Kopfzebrechen als Anfänger.

Du musst die Bytes ja nicht hexadezimal adressieren, wenn Du damit nicht zurecht kommst. Es ist doch völlig egal, in welchem Zahlensystem Du zählst, die Reihenfolge der Bytes bleibt die Selbe.

&h0A ist dezimal 10. Wenn Du die Adresse als &h0A ansprichst, bleibt das trotzdem das zehnte Byte.

Das gilt auch für due Bearbeitung der Bytes. Ob Du den Inhalt eines Bytes als &hFF oder als 255 oder als ‚11111111‘ anzeigst, ist völlig egal, der Inhalt bleibt der Selbe, das sind nur veschiedene Schreibweisen. Nimm die, die Dir am übersichtlichsten erscheint.

Zum Verändern:

Bei der Größe kannst Du noch gut die ganze Datei mit Get() in ein Array laden, die Inhalte der Felder im Array anzeigen, bearbeiten und das Array mit Put() zurückschreiben.

Gruß Rainer

PS. Sorry. :frowning: Ich habe erst den Beitrag geschrieben und dann nach dem Namen gesehen. Vergiß die Frage nach der Programmiersprache einfach wieder. :smile:

Hallo Rainer,

vielen Dank erstmal wieder für Deine Turbo Antwort! Du hast Recht, ich hab vergessen zu erwähnen es sich um VB6 handelt. Sorry!

Das ganze Hexadezimal zu belassen wäre mir schon am liebsten, da ich bisher mit einem Hex Editor diese Dateien bearbeite / schreibe. Das gilt sowohl für die Adressierung als auch für die Inhalte. Mein Problem ist nur, wie sage ich VB6, springe z.B. zum 28. Byte (&h1C) übergib mir den Inhalt in Hex und schreibe meinen Inhalt in Hex aufs 28. Byte wieder zurück! Toll wäre auch, wenn ich die kompletten 128kb ohne Resourcendatei direkt im Code verwenden könnte, z.B. als großer String. Gibt es brauchbare Tutorials die dieses ganze Thema vernünftig abhandeln?

Vielen Dank nochmals und besten Gruß!
Michel

Hallo Michael,

Das ganze Hexadezimal zu belassen wäre mir schon am liebsten,
da ich bisher mit einem Hex Editor diese Dateien bearbeite /
schreibe.

OK.

Das gilt sowohl für die Adressierung als auch für
die Inhalte. Mein Problem ist nur, wie sage ich VB6, springe
z.B. zum 28. Byte (&h1C) übergib mir den Inhalt in Hex und
schreibe meinen Inhalt in Hex aufs 28. Byte wieder zurück!

Mal für ein Byte, ohne VB extra zu öffnen:

txt = "Test"
Text1.Text = Hex(Asc(Mid(Text1.Text, Val("&h01"), 1)))
Mid(txt, Val("&h01"), 1) = Val("&h"+Text1.Text)

Toll wäre auch, wenn ich die kompletten 128kb ohne
Resourcendatei direkt im Code verwenden könnte, z.B. als
großer String.

Hmmmm, so funktioniert doch laden immer?

Dim Txt As String, ff As Integer, l As Long, DateiName As String
DateiName = "C:\Test.txt"
l = FileLen(DateiName)
ff = FreeFile
Txt = Space(l)
Open DateiName For Binary As #ff
 Get #ff, , Txt
Close #ff

Gibt es brauchbare Tutorials die dieses ganze
Thema vernünftig abhandeln?

Nö, das ist zu einfach, um dazu extra ein Tutorial zu schreiben.

Gruß Rainer

Vielen Dank Rainer,

Du hast vermutlich Recht, evtl sollte ich einfach mal das ganze Thema gründlicher angehen… Vielleicht hast Du ja einen guten Buchtipp zum Lernen für mich! :smile:

Toll wäre auch, wenn ich die kompletten 128kb ohne
Resourcendatei direkt im Code verwenden könnte, z.B. als
großer String.

Hmmmm, so funktioniert doch laden immer?

Ich meinte ohne zu laden also den ganzen Salat im Code fest als String zu verankern. z.B.

Private Eprom as String
Eprom = „EEFF 01F2 3A66…“

Die Frage wie ich dort hinkomme aus dem Binary ein Hex Textstring zu wandeln, hast Du mir aber schon oben beantwortet! Vielen lieben Dank dafür!

Besten Gruß und schönen Abend!
Michel

Hallo Michael,

Du hast vermutlich Recht, evtl sollte ich einfach mal das
ganze Thema gründlicher angehen… Vielleicht hast Du ja einen
guten Buchtipp zum Lernen für mich! :smile:

nein, leider nicht.

Mir haben Beispiele immer besser geholfen. Erst die, die VB6 selbst mitbringt, dann die auf http://www.ActiveVb.de und die Antworten hier.

Toll wäre auch, wenn ich die kompletten 128kb ohne
Resourcendatei direkt im Code verwenden könnte, z.B. als
großer String.

Hmmmm, so funktioniert doch laden immer?

Ich meinte ohne zu laden also den ganzen Salat im Code fest
als String zu verankern. z.B.

Private Eprom as String
Eprom = „EEFF 01F2 3A66…“

??? Das verstehe ich jetzt nicht. Du willst doch nicht 128k Daten im Quellcode unterbringen? Falls doch, ja, das kannst Du so ähnlich machen.

Eprom = Chr(val("&hEE"))
Eprom = Eprom + chr(val("&hFF"))

Dann würde ich aber doch lieber in eine Datei entweder die Bytes selbst schreiben (das Assembler-Programm selbst) oder eben …

231
255

Die Daten zu laden ist viel flexibler und langsamer ist das auch nicht.

Die Frage wie ich dort hinkomme aus dem Binary ein Hex
Textstring zu wandeln, hast Du mir aber schon oben
beantwortet! …

… schönen Abend!

Einen schönen Abend wünsche ich Dir auch.

Gruß Rainer

Hallo ihr beiden,

ich weiss net ob ich das richtig verstanden habe.

Aber man kann die Daten ueber eine Ressource einbinden! Oder selbst wenn, ja nachdem wie gross die Werte werden koennen. Max. 255 oder grösser ?
dann halt ein Array anlegen.
Desweiteren würde ich Daten dann intern als Zahl verwalten!

Ein kleines Demo veranschaulicht wie simple die ganze Sache ist. Dabei spielt es keine Rolle, wie gross der hex Wert ist

Option Explicit
Option Base 1

Private myData As Variant

Private Sub Form\_Load()
 myData = Array(459, 128, 10, 65, 123, 296) 'Deine ganzen Werte 
 MsgBox ShowData
End Sub

'Zahl in HexCode wandeln
Private Function NumberToHex(ByVal vRet As Variant) As String
 If IsNumeric(vRet) Then
 NumberToHex = Hex(vRet)
 Else
 NumberToHex = ""
 End If
 If Len(NumberToHex) Mod 2 \> 0 Then NumberToHex = "0" & NumberToHex
End Function

'Hex Code in Zahl wandeln
Private Function HexToNumber(vRet As String) As Variant
Dim vData As Currency
 vData = CCur("&H" & vRet)
 HexToNumber = CVar(vData)
End Function

'Alle Daten im Hex Code anzeigen
Private Function ShowData() As String
Dim I As Long
Dim vRet As String
If IsArray(myData) Then
 For I = LBound(myData) To UBound(myData)
 vRet = vRet & NumberToHex(myData(I)) & " "
 Next I
 ShowData = Left(vRet, Len(vRet) - 1)
Else
 ShowData = ""
End If
End Function

Ps: Man kann es auch abwandeln, das das Array die Hex Werte aufnimmt.
Zum Bearbeiten muss dann halt nur der entsprechende Wert im Array geaendert werden :wink:

MfG Alex

Hi Alex,

ich weiss net ob ich das richtig verstanden habe.

Aber man kann die Daten ueber eine Ressource einbinden! Oder
selbst wenn, ja nachdem wie gross die Werte werden koennen.
Max. 255 oder grösser ?

255 denke ich, das sind ja Bytes, die in einen Eprom gebrannt werden sollen, ein Assembler-Programm vermutlich.

dann halt ein Array anlegen.
Desweiteren würde ich Daten dann intern als Zahl verwalten!

Das würde ich auch, ist einfach bequemer und schneller.

myData = Array(459, 128, 10, 65, 123, 296) 'Deine ganzen
Werte

Über 127000 Werte. Die würde ich auf gar keinen Fall in den Quellcode schreiben. Wie viele Seiten würden das? 20 Werte pro Zeile, 70 Zeilen pro Seite … 90 A4 Seiten. Und bei jedem gefundenen Tippfehler den Quellcode ändern …

Gruß Rainer

Hallo Rainer,

255 denke ich, das sind ja Bytes, die in einen Eprom gebrannt
werden sollen, ein Assembler-Programm vermutlich.

Stimmt. Aber da kann man aus dem Variant ein Byte machen :wink:

dann halt ein Array anlegen.
Desweiteren würde ich Daten dann intern als Zahl verwalten!

Das würde ich auch, ist einfach bequemer und schneller.

Da sind wir uns ja einig :smile:

myData = Array(459, 128, 10, 65, 123, 296) 'Deine ganzen
Werte

Über 127000 Werte. Die würde ich auf gar keinen Fall in den
Quellcode schreiben. Wie viele Seiten würden das? 20 Werte pro
Zeile, 70 Zeilen pro Seite … 90 A4 Seiten. Und bei jedem
gefundenen Tippfehler den Quellcode ändern …

Ok, das ist quatsch. Aber warum will er sie direkt in den Quellcode einbinden? Sicher damit er nicht die Datei jedesmal extern laden muss. Wenn er diese schon hat und dort stehen die Daten drinnen, so koennte man diese als Ressource einbinden. Beim Start dann einlesen, je nachde m wie das File aufgebaut ist, dann splitten und die Daten ab in ein Array schieben :wink: Bei dieser Variante dann gleich als Byte(Zahl) speichern und fertig ist der Husten :smile:

Gruß Rainer

Gruß Alex

Hi Alex,

Ok, das ist quatsch. Aber warum will er sie direkt in den
Quellcode einbinden? Sicher damit er nicht die Datei jedesmal
extern laden muss. Wenn er diese schon hat und dort stehen die
Daten drinnen, so koennte man diese als Ressource einbinden.
Beim Start dann einlesen, je nachde m wie das File aufgebaut
ist, dann splitten und die Daten ab in ein Array schieben :wink:
Bei dieser Variante dann gleich als Byte(Zahl) speichern und
fertig ist der Husten :smile:

auch da sind wir uns einig. Ich weiß über das Projekt so viel wie Du. :smile:

Gruß Rainer

Hallo ihr Beiden!

Das ist aber lieb von euch, daß ihr mein Problemchen so durchkaut. Ich kann ja mal bissel Licht in die Idee bringen.

Generell bin ich gerade dabei ein Homecockpit für meinen Flugsimulator zu planen. Für das Flightmanagement Panel benötige ich das VB6 Programm als Entwicklungshilfe.
In dem Eprom stehen später nur Parameter dem jeweiligen Flugzeugtyp entsprechend. Diese Parameter muss ich jeweils „erarbeiten“ und dann eintragen. Im Moment mache ich das mit nem Hexeditor aber ich erhoffe mir eine deutliche Erleichterung der ganzen Angelegenheit, wenn ich mir ein spezifisches Programm zur Eingabe bastel.
Ich brauche eigentlich nur drei Textinput Boxen, in denen ich die Bytes dezimal direkt anspringen und hexadezimal verändern kann.

z.B.
[] [] [h]

Zudem muss ich die Bytes noch vertauscht schreiben

Also wird eingetragen als

Binär fällt damit schonmal aus, sonst raffe ich da gar nichts mehr.
Die Ressource ist natürlich besser, ich hatte die Dimension des Codes nicht wirklich überlegt (viele Dank Rainer!) Die Idee erschien mir nur praktischer direkt alles vor mir liegen zu haben. Als Anfänger ist es noch sehr abstrakt und unübersichtlich nur noch mit Array’s Varis und Zählern zu tun zu haben :smile:

Schönen Abend euch Beiden und Danke nochmals!
Michael

Hallo ihr Beiden!

Hallo Du einer. :smile:

Das ist aber lieb von euch, daß ihr mein Problemchen so
durchkaut.

das machen wir öfter so, das hilft oft, die optimale Lösung zu finden, Brainstorming halt. :smile:

Binär fällt damit schonmal aus, sonst raffe ich da gar nichts
mehr.

Noch mal:

Die Bytes werden immer in der selben form gespeichert, was Du wie anzeigst ist ein anderes Thema, da bist Du frei.

Bei der Verwaltung der Bytes kannst Du die entweder in einem String unterbringen, als ASCII-Zeichen, oder auch in einem Bytearray. Die Daten sind die selben, der Unterschied liegt in der Verarbeitungsgeschwindigkeit, das Array ist sehr viel schneller.

Die Ressource ist natürlich besser, ich hatte die Dimension
des Codes nicht wirklich überlegt (viele Dank Rainer!) Die
Idee erschien mir nur praktischer direkt alles vor mir liegen
zu haben. Als Anfänger ist es noch sehr abstrakt und
unübersichtlich nur noch mit Array’s Varis und Zählern zu tun
zu haben :smile:

Schönen Abend euch Beiden und Danke nochmals!

Dir auch einen schönen Abend.

Wenn Du noch Fragen dazu hast, immer her damit. :smile:
Den Vollständigen Code für einen Hexeditor möchte ich jetzt nicht schreiben und hier posten, das hilft Dir ja nicht beim Verständnis, dann kannst Du auch den fertigen Hexeditor verwenden. Aber über Fragen zu Details würde ich mich freuen.

Gruß Rainer

Mir willste ja nicht helfen :frowning:

Ich haenge immernoch an Joe seinen Problem und trete immer auf einer Stelle rum :frowning:
Irgendwie komme ich immer nen Stueck weiter und falle dann wieder 2 zurueck :frowning:

Obs an der Hitze liegt?

Hi Alex,

Mir willste ja nicht helfen :frowning:

*gg* doch! Ich habe gar nicht mitbekommen, daß Du Hilfe brauchst.

Ich haenge immernoch an Joe seinen Problem und trete immer auf
einer Stelle rum :frowning:
Irgendwie komme ich immer nen Stueck weiter und falle dann
wieder 2 zurueck :frowning:

Obs an der Hitze liegt?

Keine Ahnung.

Das Projekt schien mir inzwischen zu groß für meinen kleinen Kopf. Wenn Du schon hängst … Kannst Du mir das Projekt im Stück zukommen lassen und das Problem kurz schildern? Dann lege ich eine Nachtschicht ein. Die Puzzelteile zusammen suchen mag ich jetzt nicht. :frowning:

Gruß Rainer

Klar kein Thema und Danke erst einmal :smile:

Ist aber in VB5 getippselt. Also muesstest du gewisse Function entfernen. Ansonsten schau dir mal den Source an. Er ist simple gehalten und leicht zu verstehen. Die ServerAnwendung passt da schon. Am Clienten bin ich noch dabei :frowning: Ich sende dir mal den Server heute Abend zu. Schaue ihn dir mal an, so das du siehst, wie er fungiert. Falls du fragen hast, so frage einfach. Danach lasse ich dir den Clienten zukommen :smile:

MfG Alex

Hi Alex,

Ansonsten schau dir mal den Source an. Er ist
simple gehalten und leicht zu verstehen. Die ServerAnwendung
passt da schon. Am Clienten bin ich noch dabei :frowning: Ich sende
dir mal den Server heute Abend zu. Schaue ihn dir mal an, so
das du siehst, wie er fungiert. Falls du fragen hast, so frage
einfach. Danach lasse ich dir den Clienten zukommen :smile:

OK, das werde ich tun. Bis dann.

Gruß Rainer