PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vertauschen von Bytepositionen in BIN-File



GT2003
12.09.2006, 12:05
Hallo und Guten Morgen,

ich brauche Hilfe!
Ich möchte in einem bin-file alles byte komplett vertauschen.
Mal ein Bsp.

so sieht es vorher aus:

00000 48 61 6C 6C 6F 2C 20 64 69 65 73 20 69 73 74 20
00010 65 69 6E 20 42 65 69 73 70 69 65 6C 2D 54 65 78
00020 43 56 67 23 64 76 59 87 45 45 45 FF FF FF FF FF

danach soll es so aussehen:

00000 FF FF FF FF FF .............................................
00010 .................................................. ................
00020 ............................................. 6F 6C 6C 61 48

Für eine guten Rat wäre ich sehr dankbar. ich habe schon ein paar freeware hexeditoren probiert aber direkt so eine funktion scheint es nicht zu geben
Achso, ich muss hier mit Windows arbeiten! Also irgendwie was scripten unter linux geht nicht.

PicNick
12.09.2006, 12:30
Naja, lies doch die Datei einfach als binärfile in ein Array [ 0 ---> juchu]
und schreib sie dann in einer Schleife [juchuu --> 0] wieder raus.

?Am PC mit Windows in Assembler ?

robocat
12.09.2006, 12:55
hab das schnell für dich gec0dert, bin ich nicht lieb? ;)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
FILE *pDatei,*pZiel;
char fname[255];
char fname2[255];
long size;
char zeichen;
printf("Name der Quell-Datei?");
scanf("%s",fname);
printf("Name der Ziel-Datei?");
scanf("%s",fname2);
fflush(stdin);

pDatei = fopen(fname,"rb");

if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Quell-Datei!\n");
printf("Programm beendet.\n");
getch();
exit(1);
}

pZiel = fopen(fname2, "wb");

if(pZiel == NULL)
{
printf("Fehler beim Oeffnen der Ziel-Datei!\n");
printf("Programm beendet.\n");
fclose(pDatei);
getch();
exit(1);
}

fseek(pDatei,0,SEEK_END);
size=ftell(pDatei);

while (size>=0)
{
if(fread (&zeichen,1,1,pDatei))
fwrite (&zeichen,1,1,pZiel);
size--;
fseek(pDatei,size,SEEK_SET);
}

fclose(pZiel);
fclose(pDatei);
printf("Programm erfolgreich beendet.\n");
getch();
return 0;
}
download hier: http://codefactory.dead-men.de/reverse.exe

da ich nicht wusste, wie groß das file ist, hab ichs mal ohne puffer gemacht.

gruesse

GT2003
12.09.2006, 13:25
WOW, das ist echt MEGALIEB!!!!

das sieht man gleich wer im stoff steht.

so schnell konnte ich nichteinmal mein visual studio installieren.
das mit dem Puffer ist genau richtig so. Die dateigroessen variieren teilweise sehr stark.

@ PicNick

ich hätte das jetzt auch genau nach deinem tipp so gemacht. danke dir.



das errinnert mich irgendwie an meine informatik übungen an der uni :)

GT2003
12.09.2006, 15:21
... so ich nochmal.

ich würde unter anderen diese exe gern in einem Batchfile aufrufen.
Gibt es eine möglichkeit, das ich bei dem aufruf der exe gleich die parameter fname und fname2 übergeben kann?
wie man es sonst z.b. von nero.exe oder anderen kommandozeilenfähigen programmen kennt.

gruß GT

PicNick
12.09.2006, 15:28
Normalerweise


main(int argc, char **argv)
{
int ix;

for (ix = 1; ix <= argc;ix++)
printf("Param%d %s\n", ix, argv[ix]);

... blabla...
}

robocat
12.09.2006, 15:42
ja :oops:
ich wollte auch zuerst kommandozeilenparameter verwenden, dann lässt es sich wenigstens in ne script (batch) datei einarbeiten. ich dachte nur, so isses idiotensicher.. ^^
ausserdem hab ich grad dieses "int argc, char **argv" nemma im kopf gehabt. (danke)
wenn interesse besteht, kann ich es schnell ändern und recompilieren. (weil unser fragesteller von "mehreren dateien" spricht.)

danke fürs lob @GT2003, freut mich, geholfen zu haben.

weitere kritische anmerkungen zum code sind erlaubt und erwünscht, ich lerne gern was dazu.

EDIT:
hier also mit parametern:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
FILE *pDatei,*pZiel;
long size;
char zeichen;

if(argc<2)
{
printf("falsche Parameter\n");
printf("Syntax: reverse2.exe [path]sourcefile [path]targetname\n");
printf("Beispiel: reverse2.exe c:\autoexec.bat c:\autoexec.bak");
printf("Programm beendet.\n");
exit(1);
}

pDatei = fopen(argv[1],"rb");

if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Quell-Datei!\n");
printf("Programm beendet.\n");
exit(1);
}

pZiel = fopen(argv[2], "wb");

if(pZiel == NULL)
{
printf("Fehler beim Oeffnen der Ziel-Datei!\n");
printf("Programm beendet.\n");
fclose(pDatei);
exit(1);
}

fseek(pDatei,0,SEEK_END);
size=ftell(pDatei);

while (size>=0)
{
if(fread (&zeichen,1,1,pDatei))
fwrite (&zeichen,1,1,pZiel);
size--;
fseek(pDatei,size,SEEK_SET);
}

fclose(pZiel);
fclose(pDatei);
printf("Programm erfolgreich beendet.\n");
return 0;
}

download: http://codefactory.dead-men.de/reverse2.exe

was würdet ihr ohne die katze tun, eh? ;)

gruesse

GT2003
12.09.2006, 15:50
hehe,

das mit den paramtern war auch nicht geplant. kam nur gerade eine kollege hier bei mir auf die idee das das ganz nützlich sein könnte.

@robocat:
du brauchst das nicht extra neu zu compilieren! bisschen was will ich ja auch alleine machen. obwohl das bei euch anscheinend ja schnell von der hand geht. aber ich fuchse micn da gerne wieder rein. und mit eurer hilfe geht das ja schneller als erwartet ;)

@picNick
ebenfalls vielen dank für die parameterübergabe!

nochmals vielen dank!

robocat
12.09.2006, 16:08
hm, sry, schon geschehen O:)

PicNick
12.09.2006, 16:10
.was würdet ihr ohne die katze tun, eh..

Ja, wirklich :-)

äääähmmm: Geht das auch mit wild-cards ?

robocat
12.09.2006, 16:21
hm, sorry, nein @ wildcards
ich hab etz gec0dert, dass man quell und zieldatei explizit angibt, also klappt das nicht. wäre sicher machbar, notfalls crawled man durchs verzeichnis und jede datei bekommt ein "reversed clone".
dazu würde ich den dateinamen beim punkt splitten und ein _ oder sowas dranmachen. da es nicht puffert, kann man nicht in die datei schreiben, aus der man liest. hinterher kann man ja das original löschen und den clone umbenennen. crawlen ist hier erklärt, bzw naja, nicht erklärt, aber code is da: http://codefactory.dead-men.de/index.php?tutorial=12

gruesse von eurer katz

GT2003
13.09.2006, 09:09
guten morgen,

ich habe mal das Thema geändert, hat ja nicht mehr wirklich gepasst ;)

@robocat:
ich weiß auch nicht was wir dann machen würden :oops:


gruß GT

GT2003
13.09.2006, 15:44
... so ich gebe mal den modifizierten quelltext zum besten. er ist jetzt soweit angepasst das ich ihn so verwenden werde.

nochmals vielen dank an die beiden helfer!




#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argumentcounter, char *argumentvariable[])
{
FILE *pDatei,*pZiel;
long size;
char zeichen,endung[5],Ziel[255];
int laenge,i;

if (argumentcounter==1 || argumentcounter>3) // Fehlerhafte Eingabe
{
printf("\nFehler! Es fehlen die Parameter Quellddateiname und ggf. Zieldateiname.\n\n");
printf("Wenn der Zieldateiname gleich dem Quelldateinamen plus den Zusatz '_down' entsprechen soll, muss nur der Quelldateiname uebergeben werden. Weicht der Zieldateiname ab, muessen beiden Namen uebergeben werden.\n");
printf("\n");
printf("Bsp.: \n1.) Quell- und Zielname gleich: \n");
printf("\tAufruf: 'reverse.exe Quelle.bin'\n");
printf("\tAusgabedatei: Quelle_down.bin\n\n");
printf("2.) Quell- und Zielname ungleich \n");
printf("\tAufruf: 'reverse.exe Quelle.bin Ziel.bin'\n");
printf("\tAusgabedatei: Ziel.bin\n\n");
exit(1);
}

if (argumentcounter==2) // Zieldateiname gleich dem Quelldateinamen + "_down"
{
pDatei = fopen(argumentvariable[1],"rb");

if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Quell-Datei!\n");
printf("Programm beendet.\n");
//getch();
exit(1);
}

laenge=strlen(argumentvariable[1]);
strcpy(Ziel,argumentvariable[1]);
for (i=0;i<5;i++)
{endung[i]=Ziel[(laenge-4)+i];}


strncpy(Ziel,argumentvariable[1],laenge-4);
Ziel[laenge-4]='\0';

strcat(Ziel,"_down");
strcat(Ziel,endung);

pZiel = fopen(Ziel, "wb");

if(pZiel == NULL)
{
printf("Fehler beim Oeffnen der Ziel-Datei!\n");
printf("Programm beendet.\n");
fclose(pDatei);
//getch();
exit(1);
}
}


if (argumentcounter==3) // Quellename ungleich Zielname

{ pDatei = fopen(argumentvariable[1],"rb");

if(pDatei == NULL)
{
printf("Fehler beim Oeffnen der Quell-Datei!\n");
printf("Programm beendet.\n");
//getch();
exit(1);
}

pZiel = fopen(argumentvariable[2], "wb");

if(pZiel == NULL)
{
printf("Fehler beim Oeffnen der Ziel-Datei!\n");
printf("Programm beendet.\n");
fclose(pDatei);
//getch();
exit(1);
}


}



fseek(pDatei,0,SEEK_END);
size=ftell(pDatei);

while (size>=0)
{
if(fread (&zeichen,1,1,pDatei))
fwrite (&zeichen,1,1,pZiel);
size--;
fseek(pDatei,size,SEEK_SET);
}

fclose(pZiel);
fclose(pDatei);
printf("Programm erfolgreich beendet.\n");
//getch();
return 0;
}