Nalezení konkrétní bajt v souboru

0

Otázka

Mám soubor, ve kterém se snažím hledat pro tuto posloupnost bajtů: 0xFF, 0xD8, 0xFF, a 0xE0. Pro teď předpokládejme, že hledám jen 0xFF. Udělal jsem tento program pro testování:

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

void analyzeFile(char* filename)
{
    FILE* filePtr = fopen(filename, "rb");

    int numImages = 0;

    while (!feof(filePtr))
    {
        char bytes;

        bytes = getc(filePtr);

        printf("%c", bytes);

        if ((bytes == 0xFF))
        {
            numImages++;
            printf("image found!\n");
        }
    }

    printf("%d\n", numImages);
}

Tohle nefunguje. Když jsem hovor analyzeFile s parametrem "test.txt", vytiskne se obsah souboru v pořádku, ale nezjistí jeden 0xFF byte:

obsah test.txt:

aÿØÿÿà1234

výstup:

aÿØÿÿà1234
0

pro referenční, 0xFF je ekvivalentní k y&, ÿ, podle ASCII.

c char file
2021-11-23 15:01:14
1

Nejlepší odpověď

0

Tam jsou dva problémy s váš kód. Za prvé, viz: Proč ", zatímco ( !feof (soubor) )" vždy špatné?

Druhý problém je, že getc (nebo fgetc) vrací intne char. Jak to stojí, své char hodnota 0xFF je sign-extended (k 0xFFFFFFFFs největší pravděpodobností), když je povýšen na int pro if ((bytes == 0xFF)) srovnání. Tak, použití int pro vaše bytes proměnné a změnit smyčku testovat hodnotu, která byla přečtena na EOF signál:

void analyzeFile(char* filename)
{
    FILE* filePtr = fopen(filename, "rb");
    if (!filePtr) { // Add some error handling...
        printf("Could not open file!");
        return;
    }
    int numImages = 0;
    int bytes;
    while ( ( bytes = getc(filePtr) ) != EOF) {
        printf("%02X %c\n", (unsigned)bytes, bytes);

        if (bytes == 0xFF) { // Removed redundant extra parentheses
            numImages++;
            printf("image found!\n");
        }
    }
    fclose(filePtr); // Don't forget to close the file!
    printf("%d\n", numImages);
}
2021-11-23 17:14:53

Nesouvisí s otázkou, ale není obsazení (char)bytes jako parametr printf k ničemu? To bude odlita zpět do int výchozí akce.
Eugene Sh.

Díky za pomoc!
human bean

Hodnota (char)bytes je provádění definovány, pokud bytes > CHAR_MAX (což se může stát, pokud char je podepsána typ), takže asi lepší obsazení to char. Také, %X očekává unsigned int,, takže si udělat, třeba obsazení (do unsigned int).
Ian Abbott

@IanAbbott Spravedlivý komentář - viz edit.
Adrian Mole

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................