Seite 1 von 2
Hex-Wert zurück schreiben
Verfasst: 20.10.2024 16:48
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
Re: Hex-Wert zurück schreiben
Verfasst: 20.10.2024 18:37
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.
Re: Hex-Wert zurück schreiben
Verfasst: 20.10.2024 19:24
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
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.
Re: Hex-Wert zurück schreiben
Verfasst: 21.10.2024 08:27
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)
Re: Hex-Wert zurück schreiben
Verfasst: 21.10.2024 13:20
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.
Re: Hex-Wert zurück schreiben
Verfasst: 21.10.2024 15:37
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.
Re: Hex-Wert zurück schreiben
Verfasst: 21.10.2024 17:57
von mk-soft
Sieht nach "Number.w = ReadWord(#File)" aus
Re: Hex-Wert zurück schreiben
Verfasst: 21.10.2024 18:39
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
Re: Hex-Wert zurück schreiben
Verfasst: 22.10.2024 11:21
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.
Re: Hex-Wert zurück schreiben
Verfasst: 22.10.2024 13:20
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.