Encontrar um byte específico em um arquivo

0

Pergunta

Eu tenho um arquivo no qual eu estou tentando olhar para esta sequência de bytes: 0xFF, 0xD8, 0xFF, e 0xE0. Por agora, vamos supor que eu estou apenas olhando para 0xFF. Eu fiz esse programa para teste:

#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);
}

Isso não está funcionando. Quando eu chamo analyzeFile com o parâmetro "test.txt", ele imprime o conteúdo do arquivo bem, mas não detectar um único 0xFF bytes:

conteúdo test.txt:

aÿØÿÿà1234

saída:

aÿØÿÿà1234
0

para referência, 0xFF é equivalente a y-trema, y, de acordo com o ASCII.

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

Melhor resposta

0

Há dois problemas com seu código. Para a primeira, veja: Porque é que o "while ( !feof (arquivo) )" sempre errado?

O segundo problema é que getc (ou fgetc) retorna um int, não char. Como está, o seu char valor de 0xFF é sinal estendido (para 0xFFFFFFFF, provavelmente) quando ele é promovido para um int para o if ((bytes == 0xFF)) comparação. Portanto, use int para a sua bytes variável e alterar o loop para testar o valor que foi lido para a EOF sinal:

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

Não relacionados à questão, mas não é o elenco (char)bytes como um parâmetro para printf inútil? Ele será convertido de volta para int por padrão promoções.
Eugene Sh.

Obrigado pela ajuda!
human bean

O valor de (char)bytes é a aplicação, definido se bytes > CHAR_MAX (o que só pode acontecer se char é uma assinado tipo), então provavelmente melhor não lançá-lo para char. Também, %X espera um unsigned int, assim você não precisa de um elenco (para unsigned int) para que um.
Ian Abbott

@IanAbbott Feira comentário - ver editar.
Adrian Mole

Em outros idiomas

Esta página está em outros idiomas

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