(c++) Lesen .dat-Datei als hex mit ifstream
Dies ist mein Erster Beitrag also sorry wenn ich Pause alle ungeschriebenen Regeln. 😛 ich bin ein Anfänger/fortgeschrittene Programmierer und ich brauche Hilfe mit diesem Programm.
Ich versuche infile/Lesen/ifstream (was auch immer) ein .dat-Datei als HEX in einen großen string.
Ich will nicht, es zu Lesen, als text. Ich möchte den hex-format, so kann ich die Suche auch über die string-und die änderungen daran vornehmen. (Wie eine automatische hex-editor)
ex. meine Datei "00000000.dat" ist ~7kb groß.
Im hex editor die hex wie folgt Aussehen:
0A 00 00 0A 00 05 4C 65 76 65 6C 07 00 06 42 6C 6F 63 6B 73 00 00 80 00 07 FF 39
01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02
FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF
39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03 02 FF 3F 00 07 FF 39 01 FF 03 03
02 FF 3F 00..... for a while...
Muss ich alles in eine string-variable (keine Leerzeichen enthalten vorzugsweise).
Meinen aktuellen code sucks und jetzt druckt nur das Ergebnis. (habe es von ehow) und scheint zu wählen, und wählen, was es will-input/print.
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;
int main()
{
ifstream input;
input.open("00000000.dat");
unsigned char h1,h2;
do
{
input >> h1;
cout << hex << (unsigned int)h1;
input >> h2;
cout << hex << (unsigned int)h2;
}while(!input.eof());
cin.get();
return 0;
}
Es ist eine große Datei, so kann ich nicht zeigen, yo, was er druckt, aber es fehlen einige bytes. (ex - "0A 00 00 0A 00 05....." Drucke "00 05.....") dies gilt auch für das Ende als gut.
Sorry, wenn ich nicht erklären, es gut 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Öffnen Sie den stream als binary, wie bereits erwähnt. Sie können die regelmäßige
>>
operator, wenn Sie sagen, es nicht zu überspringen, weißen Raum.Auf, um den Inhalt in eine Zeichenfolge, die Sie verwenden können, eine
ostringstream
stattcout
.in
implizit in der openmode?ifstream
.istream_iterator
s;for(std::istream_iterator<char> i(input); i != std::istream_iterator(); ++i) { /* use *i */ }
>>
auf den binären Eingang.Du willst, die Datei zu öffnen, zu Lesen, binäre. Sie Lesen, wie der text jetzt. So sollte es Aussehen
Vielleicht möchten Sie auch zu verwenden reinterpret_cast Lesen ein byte zu einem Zeitpunkt (d.h. nicht herausfinden können, was Sie wollen -- Ihr code und Ihre Beschreibung sind dabei gegensätzliche Dinge).
Oder wenn Sie wollen einfach nur alles in einen string, warum nicht einfach deklarieren Sie eine string-und Lesen Sie es in das?
h1
soh2
konnte nicht aktualisiert wurden. Besser wiewhile(input >> h1) { /* use only h1 */ }
wenn wir müssen, verwenden Sie unformatierten input-Funktionen hier.input.get( reinterpret_cast<char&>(h1) );
sollte auch möglich sein, anstelle der Verwendungread
.std::string str{ std::istreambuf_iterator<char>{input}, std::istreambuf_iterator<char>{} };
(ja, eine Zeile)eof
ist nicht ein problem, wenn man nur eine variable verwenden, und kümmern sich nicht umgood
. OP ' s mit zwei verschiedenen Variablen, die hier aus, und der eof auftreten könnte, zwischen dem Lesenh1
undh2
.byteArray
,stringArray
,numberOfBytes
). Es ist auch "sehr langsam", wie Sie nur erhöhen Sie die Größe der*input
array um 1 jede iteration und nur Lesen, 1 byte pro iteration, die fehlt der Punktread
haben einen zweiten parameter.