@Draconis Lunaris
Öffentlich => [O] Off-Topic und Gäste => Thema gestartet von: Delo Cor am 20.Mär.09, 18:09:09
-
Und nun um Cherus Aufgabenstellung etwas mehr Übersicht zu verschaffen...
Sein Auftrag war: Öffne Datei, springe zu stelle x, Lese paar bytes, gib sie im hex-format aus
Soweit so,so gut.Klingt nach einem kleinen aber feinen Hex-Viewer(für die Konsole).
Meine Python-Lösung wäre wie folgt:
from __future__ import with_statement
import os.path
import optparse
parseobj=optparse.OptionParser()
parseobj.add_option('-p',type='string',dest='path',help="path to file e.g. C:/file.txt")
parseobj.add_option('-s',type='int',dest='pos',help="Position to start")
parseobj.add_option('-r',type='int',dest='read',help="bytes to read e.g ")
options,remainder=parseobj.parse_args()
with open(options.path,'rb') as f:
try:
f.seek(options.pos)
except TypeError:
raise TypeError,"-s parameter is incorrect/missing!"
if options.read:
output=f.read(options.read)
else:
output=f.read()
if output == '':
print "end of file reached! Max.Length: %i" %os.path.getsize(f.name)
else:
print output.encode("hex")
raw_input("press enter to quit...")
Usage: hexfromfile.exe [options]
Options:
-h, --help show this help message and exit
-p PATH path to file e.g. C:/file.txt
-s POS Position to start
-r READ bytes to read e.g
Link zur .exe : http://rapidshare.com/files/211507207/hexfromfile.zip (http://rapidshare.com/files/211507207/hexfromfile.zip)
py-Datei im Anhang(auch bei der exe dabei) ->für Linix-User wäre das wohl besser.
Python 2.5 wäre wegen des with-statements minimale Voraussetzung. ( Python 3k wäre falsch,weil es keine Rückwärtskompatibilität zu den 2.X Versionen besitzt)
-
Das Problem bei Python:
Es kann nicht ohne Interpreter laufen.
Wie ich mittlerweile weiß, hatte ich mich in meinen C++ Prog ver-pointert, darum kam bei der Wandlung kacke raus.
-
Man kann aber Python-Skripte mit dem Modul py2exe in exe Dateien kompilieren.
Das Endprodukt meines Skripts kannst du ja auf RS runterladen und ausprobieren. Es ist eine exe mit dll und sonstigen Abhängigkeiten,die ca. 3MB groß ist.(einziger Nachteil daran)
Damit läuft es auch ohne Interpreter.
-
Das Problem bei Python:
Es kann nicht ohne Interpreter laufen.
Wie ich mittlerweile weiß, hatte ich mich in meinen C++ Prog ver-pointert, darum kam bei der Wandlung kacke raus.
oh, klar, standard-fehler :)
warum hast dir hex-umschreiber eigentlich nicht selbst geschrieben?
byteweise reinleisen und hex draus machen :>
1 byte --> 2 hexzahlen
musst einfach das byte dezimal rauslesen, und mit ganzzahliger division durch 16 mit Rest (die reste sind die hex werte) beommst die lösung
kurze schleife für die 4,7gb und fertig
-
Ich will ja nicht 4,7GB lesen, sondern 2 Byte aus 4,7GB ;D
Ich denke aber mittlerweile das ich der Lösung sehr nahe bin.
Wenn ich fertig bin poste ich den Code mal zur Revision.
-
woah,da ist ja mein Skript richtig "ausgereift"!
haut genau hin,wenn man per Konsole sagt wo man anfängt und wie viel gelesen werden sollen.
Das nenn ich Bestleistung! :P
Ich frag mich,wie viel Code man in C für eine Konsolen-Anwendung dieser Art brauchen würde...
-
recht wenig zeilen :)
gleichviel oder bisschen weniger würd ich sagen
kommt drauf an, ob du MFC klassen nimmst, oder pures C programmierst. Mit purem C, kannst es sicher auf wenige zeilen optimieren :>
-
Demonstration!
-
Ich habe jetzt
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
char * rvmfile;
cout << "There were " << argc << " parameters\n";
if (argc==2) {
rvmfile = new char [strlen(argv[1])+1];
rvmfile = argv[1];
cout << rvmfile << "\n";
}
else {
cout << "No Filename specified\n";
system("PAUSE");
return EXIT_FAILURE;
}
int length = 2;
char readbuffer[3] ;
ifstream rvm;
rvm.open (rvmfile, ios::binary);
rvm.seekg (2,ios::beg);
rvm.read (readbuffer,length);
rvm.close();
cout.write (readbuffer,length) << endl;
char output[12] = "";
char * buffer = output;
for(int i = 0; i < strlen(readbuffer) ;i++ )
{
sprintf(buffer, "%x", readbuffer[i]);
buffer +=2;
}
cout << output << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Das funzt soweit auch - bei normalen Dateien. Kaum habe ich aber total dämliche Hexwerte wie z.B. FC läuft das Proggi Amok :((
Haylp!
-
Ich habe mal ne Datei angehängt. Aus dieser soll dann der Wert FC41 rauskommen
Delos Proggi:
hexfromfile.exe -p c:\test.hex -s 3 -r 2
fc41
press enter to quit...
Braver Delo
-
bist dir mit %x sicher?
war das nciht %X ??
-
ist egal, gibt nurnen unterschiedlichen case aus.
hast du Plan was bei mir schief läuft?
-
Ich habe mal ne Datei angehängt. Aus dieser soll dann der Wert FC41 rauskommen
Delos Proggi:
hexfromfile.exe -p c:\test.hex -s 3 -r 2
fc41
press enter to quit...
Braver Delo
:o
Das Problem in der hex-datei liegt wohl bei den Sonderzeichen,die du drin hast.(ü)
wie werden diese berücksichtigt?
argh,ich versteh diesen C-code nicht.werden die daten einfach nur eingelesen und ausgespuckt? ich finde keine Stelle,wo ge-"hext" wird.
-
da
for(int i = 0; i < strlen(readbuffer) ;i++ )
{
sprintf(buffer, "%x", readbuffer);
buffer +=2;
}
-
hast du schonmal probiert das ganze mal als string ausgeben zulassen?
bei mir gibt es nur ein paar Zeichen aus der Mitte und eins am Ende aus.
Ich habe nur den sprintf teil verändert in c oder s und als Beispiel eine txt.datei mit "asdasd" einlesen lassen.->da mit newline d war das ergebnis.
bei deiner hex-datei kommt nur ³ und newline raus.
strange...
-
jup. er liest das "ü" als sonstwas
-
müsstest mit richtigem charset dann rauslesen
müsst in c++ so ne funktion gebn, damit er das auch macht :)
-
was soll das denn für eine Kacke sein?
Ich sage open binary und der will ein characterset????
-
jein
er intepretiert das ü halt als irgendwas
der binäre wert stimmt schon, nur angezeigt wirds halt als irgendwas
-
Folgender Wandlungscode funzt:
char * buffer = output;
for(int i = 0; i < length ;i++ )
{
int next = (reinterpret_cast<unsigned char*>(readbuffer));
sprintf(buffer, "%02x", next);
buffer +=2;
}
buffer[0] = '\0';
Damit ist es bewiesen: C++ ist scheiße
-
nö
problem dabei is (hat java z.B. noch sclhimmer, weil da kannst gar nix binary lesen, zumindest nicht richtig dann auf Bit-Ebene werken), dass char und byte nicht das selbe sind ;)
-
Damit ist es bewiesen: C++ ist scheiße
Willkommen in der Welt C-demprimierter Nerds!
Du kannst ja schonmal ein paar Videotutorials zu Python auf ShowMeDo (http://showmedo.com/videos/series?name=pythonHollandIntroToPythonSeries_german) ansehen. Das eine habe ich mir auch angesehen und kam so auf Python. Die anderen Tutorials zu Python sind auch ganz gut.
-
ihr könnts natürlich auch C# nehmen ;)
wenn schon C/C++ zu schwer is
-
Nicht zu schwer! Zu beschissen ;D
Und komm mir jetzt nicht mit wie toll es doch ist alles selber kontrollieren zu können.
Leute die sowas sagen sollen doch ihr Auto selber bauen um damit zu fahren, dann wissen sie wie C programmieren ist :D