So speichern Sie Daten in der ausführbaren Datei

7

Ich muss einen Weg finden, 250 KB Klartextnummern in der ausführbaren Datei meines Programms zu speichern.

Normalerweise würde ich die Daten in eine separate Datei schreiben und das Programm lesen lassen, während es läuft, aber das ist hier keine Option. Stattdessen müssen das Programm und die Daten in einer ausführbaren Datei enthalten sein.

Ich habe absolut keine Ahnung, wie es geht (außer 250.000 #defines zu schreiben :-) und ich würde mich über Vorschläge freuen.

    
michael 11.04.2010, 18:31
quelle

11 Antworten

9

Wie wäre es mit einem Array? Legen Sie diese Definition einfach in eine Datei und kompilieren Sie sie in Ihr Programm:

%Vor%

Sie können sich vom Compiler sagen lassen, wie viele Elemente sich in externen Daten befinden:

%Vor%     
R Samuel Klatchko 11.04.2010, 18:38
quelle
5

Sie könnten einfach eine Array-Definition generieren. Angenommen, Sie haben numbers.txt :

%Vor%

Ich habe es für das Beispiel generiert mit:

%Vor%

Um es dann in die C-Array-Definition zu konvertieren, könnten Sie ein Skript verwenden:

%Vor%

Erzeugt:

%Vor%

Es könnte in Ihrem Programm wie folgt verwendet werden:

%Vor%

Führen Sie es aus:

%Vor%     
jfs 11.04.2010 18:58
quelle
4

Speichern Sie es als const-Array:

%Vor%

Vermutlich kennen Sie Ihren Datensatz, so dass Sie in Ihrem Fall den passenden Wert für NUMBER_MAX_LENGTH finden können.

Sie können natürlich auch ein Skript schreiben, das eine flache Zahl von Zahlen in dieses Format umwandelt. Wenn Sie möchten, können Sie die Zahlen sogar in einer Nur-Text-Datendatei behalten und das Skript während des Builds den entsprechenden C-Code wie oben generieren lassen.

Ich habe es so geschrieben, weil du "Klartextzahlen" gesagt hast, was bedeutet, dass du sie aus irgendeinem Grund als Zeichenfolgen benötigst. Wenn Sie sie lieber als Ganzzahlen haben möchten, ist es noch einfacher:

%Vor%

Angenommen, dass keine Ihrer Zahlen zu groß ist, um sie in einem int zu speichern.

    
Tyler McHenry 11.04.2010 18:38
quelle
3

Sie können den Befehl xxd mit der Option -i verwenden, um eine beliebige Datei in a zu konvertieren Zeichenvektor in C . Wenn Sie unter Windows sind, können Sie in Cygwin nachsehen.

    
epatel 11.04.2010 19:25
quelle
2

Nehmen wir an, die Zahlen sind Konstanten. Nehmen wir an, dass Sie diese Liste in der Phase "Vorkompilierung" einmal berechnen können. Nehmen wir an, dass es eine Funktion gibt, die diese Liste "zurückgeben" kann.

Erste Stufe: schreibe eine Anwendung, die getFooNumber () aufruft und perfekt funktioniert. Nett.

Zweite Stufe: Nimm diese Funktion und lege sie in ein anderes Projekt. Lassen Sie uns jetzt eine kleine Anwendung schreiben, die 250.000 Zeilen C-Code generiert.

%Vor%

Damit wird die Liste erstellt, über die Billy ONeal gesprochen hat.

Stufe 3: Verwenden Sie die Headerdatei, die Sie soeben in Phase 2 erstellt haben, und verwenden Sie sie innerhalb des ersten Projekts, um den Wert der neuen Tabelle "getFooNumber ()" aus der Nachschlagetabelle zurückzugeben.

Stufe 4: Lernen Sie, Qt zu verwenden, und verstehen Sie, dass Sie die Datei direkt einbetten und mit QFile (": application / numberz.txt") laden können.

Hinweise:  * Der C-Code ist wahrscheinlich defekt. Ich habe es nicht getestet.  * Wenn Sie Windows oder Mac verwenden, können Sie wahrscheinlich etwas ähnliches mit dem Ressourcensystem (MAC hat eine ähnliche Sache nicht?)

    
elcuco 11.04.2010 18:55
quelle
1

Ich stimme den vorherigen Antworten zu. Der beste Weg ist, es einfach im Code zu speichern und dann in das Programm zu kompilieren. Sie können sich das Format für eine ausführbare Datei ansehen und dort einige Daten / Codes hinzufügen (so arbeiten viele Viren) und einfach aus der ausführbaren Datei lesen und die Daten holen. Ссылка hat das Format für eine ausführbare Datei. Noch einmal, dies dient der Argumentation und wird nicht empfohlen.

    
Romain Hippeau 11.04.2010 18:47
quelle
0

Es klingt, als würden Sie es vermeiden, es in eine Quelldatei zu legen, aber genau das würde ich tun:

%Vor%

Es ist technisch möglich, sie als einfache Datei zu speichern und eine Linker-Anweisungsdatei zu schreiben, die einen neuen Datenabschnitt der richtigen Größe erstellt und kombiniert, aber es gibt keinen Grund. Setzen Sie diese Definition in eine separate Datei und #include es in die Datei, die es braucht

    
Michael Mrozek 11.04.2010 18:39
quelle
0

Sie können diese Lösung anpassen zu Zahlen:

%Vor%     
Billy ONeal 11.04.2010 18:44
quelle
0

Auf welcher Plattform laufen Sie? Wenn Sie unter Windows arbeiten und sich die Nummern nicht ändern, legen Sie einfach Ihre Textdatei mithilfe von Resource Linker in Programmressourcen und lesen Sie sie in Ihrem Code.

    
quelle
0

Nicht die Lösung (das wurde vorher gegeben), aber: nicht in eine Header-Datei einfügen. Schreiben Sie eine Kopfzeile, die eine Funktion definiert, die ein Array zurückgibt. Dann implementieren Sie dies in einer .c-Datei. Sonst landen Sie in einer Kompilierungsserie ...

    
Markus Pilman 11.04.2010 20:57
quelle
0

Machen Sie einfach eine Zeichenkette von so vielen Zeichen in Ihrem ausführbaren Programm, und lassen Sie dann einen anderen Abschnitt des Programms sich selbst als eine Datei öffnen, greifen Sie die Bytes, finden Sie die Zeichenfolge, die Sie kompiliert haben und verändern Sie sie direkt wie gewünscht sicher, eine eindeutige Zeichenkette dort zu setzen, um den tatsächlichen Bereich mit der Zeichenkette in der binären zu lokalisieren), muss möglicherweise das Programm nach dem Ausführen eines anderen Programms abstellen, das die Daten in das ursprüngliche Programm schreibt und es wieder ausführt, wenn das ursprüngliche Programm ist Erneut ausgeführt, kann er die neuen geschriebenen Werte aus der Zeichenkette lesen, die in seiner Binärdatei deklariert wurde, und diese verwenden, um Aufgaben auszuführen.

    
Jack Offington 25.10.2013 12:25
quelle

Tags und Links