Encontrar un específico de bytes en un archivo

0

Pregunta

Tengo un archivo en el que estoy tratando de buscar para esta secuencia de bytes: 0xFF, 0xD8, 0xFF, y 0xE0. Por ahora, supongamos que yo sólo estoy buscando 0xFF. Hice este programa para las pruebas:

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

Esto no está funcionando. Cuando llamo analyzeFile con el parámetro "test.txt", imprime el contenido del archivo a salir bien, pero no detecta una sola 0xFF byte:

contenido de test.txt:

aÿØÿÿà1234

salida:

aÿØÿÿà1234
0

para referencia, 0xFF es equivalente a y con diéresis, ÿ, de acuerdo a ASCII.

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

Mejor respuesta

0

Hay dos problemas con su código. Para la primera, a ver: ¿por Qué es "while ( !feof (archivo) )" siempre mal?

El segundo problema es que getc (o fgetc) devuelve un int, no char. Tal y como está, a su char valor de 0xFF es signo extendido (a 0xFFFFFFFF, lo más probable) cuando es promovido a un int para el if ((bytes == 0xFF)) de la comparación. Así, el uso de int para su bytes variable y cambiar el loop a prueba el valor que fue leído por el EOF señal:

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

Ajenos a la cuestión, pero no es el elenco (char)bytes como un parámetro para printf inútil? Será precedida de vuelta a int por defecto promociones.
Eugene Sh.

Gracias por la ayuda!
human bean

El valor de (char)bytes es definido por la implementación si bytes > CHAR_MAX (lo cual sólo puede ocurrir si char es una carta firmada tipo), por lo que probablemente sea mejor no echarlo a char. También, %X espera un unsigned int, así que ¿ necesita un hechizo (a unsigned int) para que uno.
Ian Abbott

@IanAbbott Feria comentario - ver editar.
Adrian Mole

En otros idiomas

Esta página está en otros idiomas

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