Wert aus TPP Datei auslesen und als Dezimalzahl in TXT speichern
Hallo, ich benötige als blutiger Laie ein wenig Hilfe.
Ich habe eine TPP Datei die ich mit HXD oder anderen Editoren öffnen muss um mir einen Wert anzeigen zu lassen. Wenn der Dezimalwert bekannt ist, kann ich nach der betreffenden Stelle in der Datei auch suchen.
Ich hätte es nun gerne so, das ich mit einem Skript, diesen sich ändernden Wert auslesen und nur diesen Wert in einer txt Datei als Dezimalzahl speichere.
Das ganze als Loop, sodass der Wert minütlich aktualisiert wird.
Mit einer bat war ich schon soweit den Wert in einen Dezimalwert zu ändern, aber alle dieses suchen des Wertes an einer bestimmten Stelle ist für mich ein Buch mit 7 Siegeln.
Gibt es für sowas ein Tutorial? Da ich das ganze für 2 werte benötige und auch trotz meines Alters noch lernwillig bin.
Da mir auch die Kenntnis über bestimmte Fachbegriffe fehlt, habe ich diese Frage erstmal ein wenig freier gestellt. Sollten Fragen diesbezüglich sein, so versuche ich weitere Auskunft zu geben.
Vielen Dank schonmal
Torsten
Als Nachtrag habe ich noch ein Foto hochgeladen welches als Beispiel aufzeigt welchen Wert ich bräuchte.
Ich habe eine TPP Datei die ich mit HXD oder anderen Editoren öffnen muss um mir einen Wert anzeigen zu lassen. Wenn der Dezimalwert bekannt ist, kann ich nach der betreffenden Stelle in der Datei auch suchen.
Ich hätte es nun gerne so, das ich mit einem Skript, diesen sich ändernden Wert auslesen und nur diesen Wert in einer txt Datei als Dezimalzahl speichere.
Das ganze als Loop, sodass der Wert minütlich aktualisiert wird.
Mit einer bat war ich schon soweit den Wert in einen Dezimalwert zu ändern, aber alle dieses suchen des Wertes an einer bestimmten Stelle ist für mich ein Buch mit 7 Siegeln.
Gibt es für sowas ein Tutorial? Da ich das ganze für 2 werte benötige und auch trotz meines Alters noch lernwillig bin.
Da mir auch die Kenntnis über bestimmte Fachbegriffe fehlt, habe ich diese Frage erstmal ein wenig freier gestellt. Sollten Fragen diesbezüglich sein, so versuche ich weitere Auskunft zu geben.
Vielen Dank schonmal
Torsten
Als Nachtrag habe ich noch ein Foto hochgeladen welches als Beispiel aufzeigt welchen Wert ich bräuchte.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 62901127843
Url: https://administrator.de/contentid/62901127843
Ausgedruckt am: 21.11.2024 um 17:11 Uhr
20 Kommentare
Neuester Kommentar
Hey,
das solltest du mal tun Wie gesagt, ich kann mir das nur sehr schwer vorstellen. Wenn ein Wert z.B. variabel zwischen 1 und 10000 sein könnte, kann man diesen "unmöglich" nur mit einem Hex darstellen und "leere" Hexwerte zum auffüllen wären sehr ungewöhnlich, da diese ja zusätzlichen Speicher benötigen.
Hier mit Powershell:
Grüße
Da diese statistischen Werte ingame in einer Tabelle angezeigt werden, gehe ich erstmal davon aus, das dieser Wert auch in der Datei an der gleichen Stelle ist. Werde dies bei Gelegenheit aber noch überprüfen.
das solltest du mal tun Wie gesagt, ich kann mir das nur sehr schwer vorstellen. Wenn ein Wert z.B. variabel zwischen 1 und 10000 sein könnte, kann man diesen "unmöglich" nur mit einem Hex darstellen und "leere" Hexwerte zum auffüllen wären sehr ungewöhnlich, da diese ja zusätzlichen Speicher benötigen.
Sollte dies nicht so sein, ist wohl das ganze Vorhaben so nicht möglich
So nicht, aber eventuell gibt es ja andere Methoden z.b. RegExOder wird gar eine exakte Position angegeben auf die man sich in der Suche beziehen kann?
Ja das geht.Hier mit Powershell:
$dateipfad = "C:\Users\X\Desktop\X.tpp"
# Überprüfen, ob die Datei existiert
if (-Not (Test-Path -Path $dateipfad)) {
Write-Host "Datei nicht gefunden: $dateipfad"
exit
}
# Datei in Hexadezimal umwandeln
$hexDaten = [System.IO.File]::ReadAllBytes($dateipfad) | ForEach-Object { $_.ToString("X2") }
# Den 255. und 256. Hex-Wert extrahieren
$hex255 = $hexDaten[254] # Index ist nullbasiert, daher 254 für den 255. Wert
$hex256 = $hexDaten[255] # Index ist nullbasiert, daher 255 für den 256. Wert
# Die Hex-Werte ausgeben
Write-Host "255. Hex-Wert: " $hex255
Write-Host "256. Hex-Wert: " $hex256
Grüße
Wenn ich jetzt eine Zahl von sagen wir 5817 habe, so wäre das ja 16B9. Wäre dann in deinem Beispiel der Wert bei hex255 gleich 16 und bei hex 256 gleich B9 und müsste das ganze dann noch irgendwie zusammengeführt werden?
In der Tat, die beiden Hex-Werte müssen als string zusammengefasst und dann umgerechnet werden
Habe den Code ein wenig angepasst und erweitert:
# Den 255. und 256. Hex-Wert extrahieren
$hex1 = $hexDaten[254] # Index ist nullbasiert, daher 254 für den 255. Wert
$hex2 = $hexDaten[255] # Index ist nullbasiert, daher 255 für den 256. Wert
# Die Hex-Werte ausgeben
Write-Host "1. Hex-Wert: " $hex1
Write-Host "2. Hex-Wert: " $hex2
# Die beiden Hex-Werte kombinieren
$combinedHex = $hex1 + $hex2
Write-Host "Kombinierter Hex-Wert: " $combinedHex
# Den kombinierten Hex-Wert in einen Dezimalwert umwandeln
$decCombined = [convert]::ToInt32($combinedHex, 16)
Write-Host "Kombinierter Dezimalwert: " $decCombined
Moin.
Wenn die Offsets immer gleich bleiben ist es ja simpel.
Wenn der Offset aber variabel ist muss man entweder den binären Aufbau studieren oder eine sich nicht verändernde einmalige Bitsequenz suchen welche einen festen Offset von den gesuchten Daten hat
Hier mal ein Beispiel um ein Muster von 3 Bytes (0x3,0x3,0x3) in den Daten zu suchen um dann die beiden direkt auf das Muster folgenden Bytes auszulesen um diese dann in ein Int16 zu wandeln
Online-Demo
Gruß Strods
Wenn die Offsets immer gleich bleiben ist es ja simpel.
Wenn der Offset aber variabel ist muss man entweder den binären Aufbau studieren oder eine sich nicht verändernde einmalige Bitsequenz suchen welche einen festen Offset von den gesuchten Daten hat
Hier mal ein Beispiel um ein Muster von 3 Bytes (0x3,0x3,0x3) in den Daten zu suchen um dann die beiden direkt auf das Muster folgenden Bytes auszulesen um diese dann in ein Int16 zu wandeln
Online-Demo
[byte[]]$data = [io.file]::ReadAllBytes("d:\test.tpp")
$searchpattern = 0x3,0x3,0x3
$valuelength = 2
0..($data.length -1) | %{
if (($data[$_..($_+$searchpattern.length-1)] -join '') -eq ($searchpattern -join '')){
$offset = $_
return
}
}
if ($offset){
$value = $data[($offset+$searchpattern.length)..($offset+$searchpattern.length+$valuelength-1)]
[array]::Reverse($value)
$value = [bitconverter]::toint16($value,0)
"Prefix found at index $offset"
"Value after prefix sequence: $value"
}else{
"Pattern not found"
}
Kannst du so vergessen, das sind komprimierte Chunks da wird sich immer wieder was ändern.
Da musst du den Typ des Spiels und nach dessen genutztem Verfahren recherchieren, oder am Code reverse engineeren.
Anhand der magic bytes am Anfang von Dateien lässt sich oft auch ermitteln was der Entwickler dafür genutzt hat.
Da musst du den Typ des Spiels und nach dessen genutztem Verfahren recherchieren, oder am Code reverse engineeren.
Anhand der magic bytes am Anfang von Dateien lässt sich oft auch ermitteln was der Entwickler dafür genutzt hat.
@13910172396, so tief stecke ich leider nicht drin im Bytecode, aber woran machst du klar, dass es komprimierte Chunks sind bzw. was zeichnet diese aus?
Immerhin scheint @godis3mpty ja seine Werte zu finden. Oder ist das nur Zufall?
Bezüglich des Offsets und SearchPatterns:
Es wäre spannend zu wissen, wo vor der 711A ein fester Wert zu erkennen ist. Der kann auch ein gutes Stück davor liegen, weil die Bytes vor 711A eventuell ja auch "Nutzdaten"/"Werte" sind
Immerhin scheint @godis3mpty ja seine Werte zu finden. Oder ist das nur Zufall?
Bezüglich des Offsets und SearchPatterns:
Es wäre spannend zu wissen, wo vor der 711A ein fester Wert zu erkennen ist. Der kann auch ein gutes Stück davor liegen, weil die Bytes vor 711A eventuell ja auch "Nutzdaten"/"Werte" sind
Zitat von @Michi91:
@13910172396, so tief stecke ich leider nicht drin im Bytecode, aber woran machst du klar, dass es komprimierte Chunks sind bzw. was zeichnet diese aus?
Das zu erklären würde jetzt zu lange dauern. Mit der Zeit sieht man das halt auf einen Blick wenn man viel mit Byte-Strukturen hantiert.@13910172396, so tief stecke ich leider nicht drin im Bytecode, aber woran machst du klar, dass es komprimierte Chunks sind bzw. was zeichnet diese aus?
Was mich dennoch stutzig macht, woher weiß das Spiel dann, welcher Wert in die integrierte Tabelle muss.
Die haben es ja programmiert also müssen sie es wissen . Wenn man weiß wie das Spiel heißt kann man mehr machen ...Dachte es wäre so möglich, da es auch Mods gibt, die das ganze im HUD ingame anzeigen können.
Dann verrate uns mal wie das Spiel heißt Und eventuell noch Beispiele für solche Mods, dann kann man vielleicht bissl recherchieren wie man an die Daten kommt.Finde den Wert ja auch nur, wenn ich diesen explizit suche.
Okay, dann wirds schwierigWas mich dennoch stutzig macht, woher weiß das Spiel dann, welcher Wert in die integrierte Tabelle muss.
Es wandelt die Daten wieder in für das Spiel verarbeitbare Daten um. Ist vermutlich ein bissl vergleichbar mit einer gezippten PDF, wenn man weiß, wie man "unzipped", kommt man auch an die PDF.Wenn es sich um Komprimierung handelt, wovon wir ja nun ausgehen können, werden wir auch keinen festen Wert finden.
Leider bin im Bytecode nicht zuhause, hätte aber schon Interesse dir weiter zu helfen. Vielleicht kannst du den Anfang der Datei ja mal hier posten. @13910172396 schieb ja, dass die ersten Bytes eventuell Aufschluss liefern
Hallo,
https://usk.de/alle-lexikonbegriffe/hud/
Gruss,
Peter
Zitat von @godis3mpty:
Dachte es wäre so möglich, da es auch Mods gibt, die das ganze im HUD ingame anzeigen können.
https://de.wikipedia.org/wiki/Head-up-DisplayDachte es wäre so möglich, da es auch Mods gibt, die das ganze im HUD ingame anzeigen können.
https://usk.de/alle-lexikonbegriffe/hud/
Sowas werden die Gameentwickler zwar nicht verraten, aber bestünde die Chance, das der Wert, der eben in dieser Ingametabelle steht noch irgendwoanders gespeichert wird, oder nimmt das Spiel auch diese Werte aus der Datei?
Kommt drauf an was der/die Entwickler sich da vorgestellt haben und ob sie andere auf falsche Spuren führen wollen.Gruss,
Peter
Hey,
also wenn man sich die Datei ingesamt anschaut, scheint es doch recht "übersichtlich" zu sein.
Es handelt sich um einen Spielstand aus "7daytodie", einen "Editor" habe ich unter https://github.com/Karlovsky120/7DaysProfileEditor gefunden.
Im Quellcode sieht man allerdings ganz gut, wie Byteweise, Stringweise oder eine bestimmte Range ausgelesen wird. Eine Kompriemierung scheint es nicht zu geben
Allerdings ist das Tool sehr alt und die Dateiformatsversionen "40" vs "55" liegen weit auseinander
und wird vermutlich nur wenig gutes ausspucken. Ob jemand die Muße hat, das Tool zu erneuern, darf bezweifelt werden...
Grüße
also wenn man sich die Datei ingesamt anschaut, scheint es doch recht "übersichtlich" zu sein.
Es handelt sich um einen Spielstand aus "7daytodie", einen "Editor" habe ich unter https://github.com/Karlovsky120/7DaysProfileEditor gefunden.
Im Quellcode sieht man allerdings ganz gut, wie Byteweise, Stringweise oder eine bestimmte Range ausgelesen wird. Eine Kompriemierung scheint es nicht zu geben
Allerdings ist das Tool sehr alt und die Dateiformatsversionen "40" vs "55" liegen weit auseinander
und wird vermutlich nur wenig gutes ausspucken. Ob jemand die Muße hat, das Tool zu erneuern, darf bezweifelt werden...
Grüße
7daytodie
Wenn mir nur noch 7 Tage bleiben würden mir auch ehrlich gesagt bessere Dinge einfallen 🤪.