godis3mpty
Goto Top

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.
picsart_24-07-29_08-43-54-919

Content-ID: 62901127843

Url: https://administrator.de/forum/wert-aus-tpp-datei-auslesen-und-als-dezimalzahl-in-txt-speichern-62901127843.html

Ausgedruckt am: 22.12.2024 um 06:12 Uhr

Michi91
Michi91 29.07.2024 um 08:59:39 Uhr
Goto Top
Hey, Ich kenne keine TTP Dateien und auch nicht den Sinn und Zweck des Wertes.

Woher weißt du, an welcher Stelle du ihn in der Datei suchen musst? Wenn wir dein "Suchmuster" kennen, können wir eventuell auch passenden RegEx oder ähnliches finden face-smile

Grüße
godis3mpty
godis3mpty 29.07.2024 um 09:16:17 Uhr
Goto Top
Du hast Recht, es ist eine tpp Datei. Es handelt sich um ein Savegame in welchem Statistiken gespeichert werden. Diesen Wert kann ich über das Spiel direkt beziehen und dann mit hxd suchen und auch lokalisieren. Also Spalte und Zeile sind bekannt.
Michi91
Michi91 29.07.2024 um 09:59:20 Uhr
Goto Top
Und Zeile / Spalte bleiben immer gleich, egal welcher Spielstand? Hört sich etwas ungewöhnlich an.
Die HEX-Werte vor / nach dem Wert, also 00 66 davor und 53 66 68 10 danach sind immer gleich? Oder ändern die sich?
godis3mpty
godis3mpty 29.07.2024 um 10:08:48 Uhr
Goto Top
Bitte keine Werte aus dem Bild nehmen, dies diente nur zur Veranschaulichung welche Werte ich meine.

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. Sollte dies nicht so sein, ist wohl das ganze Vorhaben so nicht möglich.

Der hex-wert danach ändert sich aber definitiv auch, das wäre nämlich der zweite variable wert der sich ändert und auch ausgelesen werden muss. Aber beides getrennt voneinander.

Ist es nicht möglich über diese Spalten und Zeilen zu suchen? Oder wird gar eine exakte Position angegeben auf die man sich in der Suche beziehen kann?
Michi91
Michi91 29.07.2024 um 10:21:15 Uhr
Goto Top
Hey,

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 face-smile 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 face-smile z.b. RegEx

Oder 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
godis3mpty
godis3mpty 29.07.2024 um 10:31:37 Uhr
Goto Top
Oha, dein Beispiel sieht schon sehr vielversprechend aus

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?

So hilft mir das auf alle Fälle schonmal sehr viel weiter als alles was ich bereits so durchforstet habe. Danke schonmal für das begreiflicher machen!
Michi91
Michi91 29.07.2024 um 11:26:27 Uhr
Goto Top
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  
13910172396
13910172396 29.07.2024 aktualisiert um 11:49:19 Uhr
Goto Top
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
[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"  
}
Gruß Strods
godis3mpty
godis3mpty 29.07.2024 um 14:29:23 Uhr
Goto Top
Hier nochmal ein Bild aus meiner Datei und dem markierten Bereich den ich benötige, wobei die 711A dem ersten Wert entspricht und die 04 dem zweiten.
Ich hab da aber jetzt schon den Verdacht, das im Offset vorgestern eine andere Zeile war und zwar die 000005C0, da muss ich erst nochmal gegenchecken ob sich das ändert. Frage wäre ab wann
image
13910172396
13910172396 29.07.2024 aktualisiert um 14:49:58 Uhr
Goto Top
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.
Michi91
Michi91 29.07.2024 um 14:55:58 Uhr
Goto Top
@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
13910172396
13910172396 29.07.2024 aktualisiert um 15:00:25 Uhr
Goto Top
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.
godis3mpty
godis3mpty 29.07.2024 um 15:08:41 Uhr
Goto Top
Hmm ok, dann dennoch Danke für euer beider Hilfe. Dachte es wäre so möglich, da es auch Mods gibt, die das ganze im HUD ingame anzeigen können.

Finde den Wert ja auch nur, wenn ich diesen explizit suche. Was mich dennoch stutzig macht, woher weiß das Spiel dann, welcher Wert in die integrierte Tabelle muss.

Sollte ich dennoch ein Thema aufgestoßen haben, dann ruhig weiter schreiben, möchte wissen wohin Michis Fragen führen. Denke aber mal, das wenn es weiter davor einen festen Wert gibt, dies dann aber zu weit entfernt scheint und sich dazwischen eine Menge verschiebt.
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?
13910172396
13910172396 29.07.2024 aktualisiert um 15:40:09 Uhr
Goto Top
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 face-smile. Wenn man weiß wie das Spiel heißt kann man mehr machen ...
Michi91
Michi91 29.07.2024 aktualisiert um 15:35:41 Uhr
Goto Top
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 face-big-smile 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 schwierig

Was 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
Pjordorf
Pjordorf 30.07.2024 um 00:14:10 Uhr
Goto Top
Hallo,

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-Display
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
godis3mpty
godis3mpty 30.07.2024 um 00:47:27 Uhr
Goto Top
@Michi91, ich schieb dir morgen Nachmittag Mal die Datei und sämtliche Infos rüber die du brauchst.

Danke schonmal
Michi91
Michi91 31.07.2024 aktualisiert um 08:39:53 Uhr
Goto Top
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
13910172396
13910172396 31.07.2024 aktualisiert um 08:51:35 Uhr
Goto Top
7daytodie
Wenn mir nur noch 7 Tage bleiben würden mir auch ehrlich gesagt bessere Dinge einfallen 🤪.
godis3mpty
godis3mpty 31.07.2024 um 12:23:12 Uhr
Goto Top
@13910172396, das a richtig und b falsch 😋