Hex-Wert zurück schreiben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Blitzer
Beiträge: 97
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

Hex-Wert zurück schreiben

Beitrag von Blitzer »

Hallo,

mit einem HexEditor erhalte ich aus einer Binär-Datei den Wert von z.B. "A816".
Ich möchte diesen Hex-Wert ändern wieder zurück schreiben.

Code: Alles auswählen

  result_hex$ = "A816"
  result_bin$ = Bin(Val("$" + Result_hex$)) 
  
  Debug result_hex$
  Debug result_bin$
Wie wird ein neuer Wert gespeichert, in Hex- oder Bin-Format?
Ein kurzes Bsp. wäre hilfreich.

Danke
Blitzer
(Ich wünsche jeden der mich kennt, 10 x soviel wie er mir gönnt)
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Hex-Wert zurück schreiben

Beitrag von mk-soft »

Bei der Ausgabe von Werten aus einer Datei als Hex oder Bin als String ist nur eine Darstellung damit ein Mensch es lesen kann
In der Datei ist es immer eine folge von Bytes. Somit muss es auch als Byte geschrieben werden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Hex-Wert zurück schreiben

Beitrag von H.Brill »

Wie möchtest du denn ändern ?
Als binärer String die Nullen und Einsen tauschen
Als Hexadezmaler Wert als Ganzes
oder als vorher umgewandelte dezimale Zahl

Code: Alles auswählen

Val("$" + Result_hex$)
Wenn alles hexadezimal in der Datei gespeichert ist, gibt es ja entsprechende File-Befehle

Code: Alles auswählen

Zahl.i = ReadInteger(#Datei)    -    Ergebnis = WriteInteger(#Datei, Zahl)
Man muß bedenken, daß Integer 4 Bytes groß sind. Wenn du die genaue Position weißt,
kannst du ja mit FileSeek genau da drauf positionieren und lesen oder schreiben.
Ich weiß jetzt nicht, ob der Dateizeiger beim Lesen/Schreiben automatisch vorrückt.
Das kann man aber leicht mit Loc() herausfinden. Andernfalls mußt du halt immer
4 Stellen beim Lesen vorrücken.
PB 6.10
Blitzer
Beiträge: 97
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

Re: Hex-Wert zurück schreiben

Beitrag von Blitzer »

Es ist schwierig bei den vielen Möglichkeiten der Zahlensysteme die Frage genau zu definieren.

Die Hex-Zahlen (0-F), die ein HexEditor bereitstellt, dienen nur zur besseren Lesbarkeit für den Nutzer.

In der Ansicht im Hexeditor (Hexdump) können die Bytes direkt geändert und abgespeichert werden.

Dieses Szenario gilt es mit Purebasic zu wiederholen!

Beispiel: Im HxD kann direkt "A816" per Tastatur in "4711" geändert werden. In PB kann aus einer Datei "A816" gelesen werden. Der binäre Wert ist auch bekannt. Wie speichere ich den neuen Wert "4711" wieder an diese Stelle zurück? (lesen - ändern - speichern)
(Ich wünsche jeden der mich kennt, 10 x soviel wie er mir gönnt)
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Hex-Wert zurück schreiben

Beitrag von H.Brill »

Blitzer hat geschrieben: 21.10.2024 08:27 In PB kann aus einer Datei "A816" gelesen werden. Der binäre Wert ist auch bekannt. Wie speichere ich den neuen Wert "4711" wieder an diese Stelle zurück? (lesen - ändern - speichern)
Deine Zahl 4711 ergibt hex : $1267 (debug(hex(4711) )

Schreibe mal, wie du lesen tust. (Byteweise mit ReadByte, zahlenweise mit ReadInteger stückweise mit ReadData o. ä.).
Das scheint ja schon zu funktionieren. Du brauchst doch nur die Dateizeigerposition mit Loc(#datei) vor dem Lesen merken,
dann lesen, mit FileSeek(#datei, position) den Zeiger wieder genau draufsetzen und neuen Wert wieder schreiben.
Verwende immer das Gegenstück, das du zum Lesen verwendet hast

ReadByte - WritByte
ReadData - WriteData
usw.
PB 6.10
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Hex-Wert zurück schreiben

Beitrag von NicTheQuick »

Ich verstehe es so, dass "4711" ein Hex-Wert ist. Bitte nutzt alle einheitliche Schreibweisen um euer Zahlenformat anzugeben. Zum Beispiel so:
- $4711 (hex)
- 18193 (dezimal)
- %0100011100010001 (binär)

@Blitzer:
Wenn du den Wert $A816 bereist auslesen kannst, dann hast du vermutlich schon mit FileSeek() und ReadInteger() oder ReadLong() oder vergleichbarem gearbeitet. Jetzt musst du einfach nochmal das selbe machen, aber eben mit WriteInteger() bzw. WriteLong(). Also vorher mit FileSeek() an die richtige Stelle in der Datei springen und dann eben schreiben und Datei speichern.
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Hex-Wert zurück schreiben

Beitrag von mk-soft »

Sieht nach "Number.w = ReadWord(#File)" aus
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Blitzer
Beiträge: 97
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

Re: Hex-Wert zurück schreiben

Beitrag von Blitzer »

.
so geht's:

Code: Alles auswählen

If OpenFile(2,"NewHex.bin")
  ; Hexadezimal lesen (evtl. ändern) und wieder hexadezimal schreiben
  Lese$ = "A8"
  Schreibe=Val("$"+Lese$)
    Debug "Lese Hex2Dec: "+"       aus $" + Lese$+"  wird " + Str(Schreibe)
      WriteByte(2,Schreibe)
    Debug "Schreibe Hex2File: " + " aus " + Str(Schreibe) + " wird " + "$" + Lese$
  CloseFile(2)
EndIf
End
Danke an alle für die Hilfestellung. Ich kam nicht drauf ... War wohl ein "bin" zu viel.

Blitzer
(Ich wünsche jeden der mich kennt, 10 x soviel wie er mir gönnt)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Hex-Wert zurück schreiben

Beitrag von NicTheQuick »

Denk dran, dass Bytes einen Wertebereich von -128 bis 127 haben. Das heißt solltest du einen Hexwert größer als $7F reinschreiben, wird der Wert im Zweierkomplement interpretiert und in die Datei geschrieben. Das macht binär keinen Unterschied, aber falls du auch ReadByte() benutzt, wird der Wert danach negativ zurückgeliefert.
Wenn es dir hier nur um positive Ganzzahlen geht, kannst du auch WriteAscii() und ReadAscii() nutzen.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Hex-Wert zurück schreiben

Beitrag von H.Brill »

Darum ist es ja auch wichtig, daß man weiß, was und wie etwas gespeichert ist, um dann
entweder byteweise, wordweise, int/longweise oder als Block mit ReadData zugreifen
zu können.
PB 6.10
Antworten