gmw
Hallo, habe da folgende Aufgabe gestellt bekommen:
Ich habe eine .bin Datei und soll das höchste Produkt of "any 5 consecutive Bytes" der Datei ermitteln.
Jetzt weiß ich zuallererst mal gar nicht was consecutive Bytes überhaupt sind. Was ich weiß ist dass die Aufgabe in VB gelöst werden kann (und da ich diese Sprache auch wenigstens Ansatzweise beherrsche poste ich mal hier), es kann aber auch mit Perl, Java und anderem gelöst werden.
Was ich bisher hergekriegt habe ist eine Ausgabe von Binärwerten zu Dezimalzahlen, dafür hab ich ein Programm namens "BinToAscii" verwendet, dieses gibt mir 5 Sektoren aus, von denen in 4 lauter Zahlen stehen. Aber weiter komm ich auch schon nicht mehr. Bitte um genaue Hilfe, Dank ist in Hülle und Fülle zu erwarten
neonator
mein übersetzer sagt dazu: "irgendwelche 5 nachfolgenden Bytes"
vielleicht hilft dir das...
ist wahrschein, dass du schaust, welche 5 hintereinander folgenden zeichen das höchste produkt ergeben...
aber ich kann kein vb, kann dir darum auch nicht weiterhelfen...
Hanfling
C++, kann ja auch portiert werden, bei bedarf.
Müsste so funktionieren... ist aber nur grob spontan ausm Kopf und nüchtern bin ich auch ned. (:
| php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
|
<?php #include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[]) {
ifstream in;
// prelast edit: noch eine Kleinigkeit ;)
if (argc == 1) { cout << "usage byte5.exe <filename>" << endl; exit(1); }
in.open(argv[1], ios::binary);
unsigned char buf[5];
unsigned char rbuf[5];
int start = 0;
int max = 0;
int tstart, tmax;
int i = 0;
if (!in.is_open()) {
cout << "error opening file..." << endl;
exit(1);
}
in.read((char *)&buf, sizeof(unsigned char)*5);
while (!in.eof()) {
tstart = in.tellg();
in.read((char *)&buf[i], 1);
if (i != 4) {
i++;
}
else {
i = 0;
}
tmax = buf[0] * buf[1] * buf[2] * buf[3] * buf[4];
if (tmax > max) {
max = tmax;
start = tstart;
memcpy(rbuf, buf, 5);
}
}
cout << "max: " << max << " at " << start << "-" << start+5 << endl;
cout << "values: " << (int)rbuf[0] << "*" << (int)rbuf[1] << "*";
cout << (int)rbuf[2] << "*" << (int)rbuf[3] << "*" << (int)rbuf[4] << endl;
cin.get();
} ?> |
|
/edit so habs auch bissl ausgebessert :p
/dürfte noch irgendwo nen fehler sein, bin aber grade zu müde/faul zum Suchen.
Gut Nacht
Irgendwie ist der PHP Tag auch toll für C++;
/nochma edit, wohl letzter:
Ich bin doch noch nicht schlafen, compiled, schmiert nicht ab und dürfte das richtige anzeigen.
gmw
Also erst mal vielen Dank für den Code, ich habs compiled und es funzt auch, allerdings ist das Ergebnis nicht richtig.
Ich hab mir das ganze mal angesehen. Ich versteh zwar nicht allzuviel von der Sache aber ich denke ich habe die wichtigsten Dinge gesehen. Mir ist auch aufgefallen dass rbuf nicht das gleiche ist wie buf (die memcpy funktion sollte doch aber eigentlich dies bewirken?)
Außerdem kommt mir das in.tellg verdächtig vor, das gibt doch die Größe der Datei zurück, wieso ist das tstart?
Auch tmax und max sind nicht das Selbe (müsste es am Ende aber sein?)
Ich hab versucht die Fehler selbst zu beheben, bin aber irgendwie zu unfähig. Bitte also nochmals um Hilfe. Vielen Dank!
mfg Sebastian
gmw
So, also ich hab jetzt selbst eine Lösung... ersannt.
Zuerst habe ich einen HEX-Editor benutzt um die Binärzahlen in Dezimalen umzuwandlen, diese habe ich dann einfach ins Excel geschaufelt, was schlussendlich eine 16x625 große Tabelle ergab. Dann hab ich in VBA einfach das folgende Script geschrieben (ist vermutlich völlig unnötig kompliziert, aber trotzdem

und dann hatte ich die richtige Antwort. Es war nicht ganz leicht die Tabelle in 5er Blöcke einzuteilen, denn die Zahlen sind ja in der Reihenfolge Nebeneinadner zuerst, nicht untereinander (also musste ich Blöcke von A1-E1, B1-F1,C1-G1 etc machen, was auch ein Problem war denn nach M1-P1 musste N1-A2 kommen
http://hak.feldkirch.com/~schmiwo/jennyseb/omfg.txt
Viel Spass beim Kopfschütteln
Hanfling
Meinst du den Wert als unsigned oder signed?