Suche für Binäre Muster in C (Read buffered-Binär-Datei)
Hey es. Ich bin versucht, zu schreiben ein kleines Programm, Lesen Sie die vier folgenden bytes nach dem letzten vorkommen von "0xFF 0xC0 0x00 0x11", das kann leicht konvertiert werden, um Binär oder dezimal. Der Zweck ist, dass die 2-5 bytes nach dem letzten vorkommen, dass hex-Muster repräsentieren die Breite und Höhe einer JPEG-Datei.
#include <stdio.h>
int main () {
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen ( "pano8sample.jpg" , "rb" );
if(pFile==NULL){
fputs ("File error",stderr);
exit (1);
}
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
printf("\n\nFile is %d bytes big\n\n", lSize);
buffer = (char*) malloc (sizeof(char)*lSize);
if(buffer == NULL){
fputs("Memory error",stderr);
exit (2);
}
result = fread (buffer,1,lSize,pFile);
if(result != lSize){
fputs("Reading error",stderr);
exit (3);
}
//0xFF 0xC0 0x00 0x11 (0x08)
//Logic to check for hex/binary/dec
fclose (pFile);
free (buffer);
return 0;
}
Das problem ist, ich weiß nicht, wie zu Lesen, aus dem gepufferten Speicher rekursiv und die meisten vor kurzem Las variable als int zu vergleichen, gegen meine Binär/hex/dec.
Wie mache ich das?
InformationsquelleAutor Supernovah | 2009-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn
last_needle
ist nicht null, können Sie drucken Sielast_needle+4
...memmem()
Funktion ist nicht standardisiert, die POSIX, aber auf Linux und AIX, aber nicht auf MacOS X (10.5) oder Solaris 10.Für diejenigen ohne ein memmem Umsetzung überlasse ich es als eine übung für den Leser...
memmem() scheint auf OSX developer.apple.com/legacy/library/documentation/Darwin/... ich sehe es auch so, mit Menschen memmem (OSX 10.11.6)
InformationsquelleAutor Keith Randall
Lesen, anstatt die ganze Datei in den Speicher, würde ich ein wenig von einem Zustand der Maschine. Mein C ist ein bisschen eingerostet, aber:
am Ende, Sie sind Links mit 5 bytes im lastBytes welches sind die fünf bytes direkt nach der letzten Zeit finden Sie searchChars
InformationsquelleAutor Igor Serebryany
Persönlich würde ich eine Funktion verwenden, die schluckt ein Zeichen zu einem Zeitpunkt. Die Funktion wird mit einem finite-state-Maschine zu tun, einen einfachen regulären Ausdruck übereinstimmen, speichern Informationen in einer statischen lokalen Variablen oder einem parameter-block-Struktur. Sie müssen zwei sub-Blöcke - eines für Teil-abgestimmte Staatliche und eine für die Letzte komplette match - jeweils mit Angabe der entsprechenden Position oder den Wert wie erforderlich.
In diesem Fall sollten Sie in der Lage sein, den Aufbau dieser manuell. Für komplexere Anforderungen, betrachten Ragel.
InformationsquelleAutor Steve314
Können Sie die fscanf-Funktion in C/C++, wenn die Daten codiert in ascii. Wenn nicht, haben Sie, um deine eigene Funktion schreiben, die dies tun wird. Einfache Weg wäre, zu Lesen N-Menge der bytes aus der Datei, suchen Sie die byte-Zeichenfolge für das Muster, das Sie wollen, dann weiter bis EOF.
Dein code tatsächlich liest die gesamte Datei auf einmal (unnötig, wenn man die Zeile, die Sie suchen, ist in der Nähe der Anfang der Datei.) Dein code speichert die Datei auf dem heap als byte-array (char entspricht einem byte in C++) mit Puffer-Zeiger an den Anfang eines zusammenhängenden Arrays im Speicher. Manipulieren die Puffer-array wie würden Sie manipulieren jedes andere array.
Auch, wenn Sie zu tun beabsichtigen alles, nachdem Sie Sie gelesen haben, die Größe, stellen Sie sicher, dass Sie frei die malloced buffer-Objekt zu vermeiden, ein Leck.
denn es scheint wieder die junk-Werte. Wie Vergleiche ich die letzten fgetc Ergebnis auf ein binäres 8-bit-byte?
Ich glaube nicht, verwenden fgetc viel, aber ich denke, es gibt ein byte von der aktuellen position der internen Datei-position.
Sie wollen zu werfen das Ergebnis erhalten Sie von fgetc in einen unsigned char (das bedeutet einen Wert von 0-255) und dann vergleichen. Ein char hat negativen Wert-Darstellung zu, das ist wohl die Verschraubung.
oder kann man das auch vergleichen mit einem hexadezimalen Wert. Nur predend, was Sie wollen, zu vergleichen mit dem PREFIX 0x angeben und der compiler weiß, Sie wollen zu vergleichen hexadezimalen Werte.
InformationsquelleAutor ldog