Pregunta

Aquí está mi código:

#include <stdio.h>

int main(void) {

        FILE *fp;
        unsigned int i;
        char bytes[512];
        fp = fopen("myFile","r");
        for(i = 0;i <= 512;i++) {
                fread(&bytes, sizeof(bytes), 1, fp);
                printf("bytes[%d]: %x\n", i, bytes[i]);
        }
}

Aquí está el resultado esperado

$ hexdump myFile
0000000 aa55 aa55 0060 0000 0a17 0000 b1a5 a2ea
0000010 0000 0000 614c 7563 616e 0000 0000 0000
0000020 0000 0000 0a68 0000 1001 421e 0000 0000
0000030 f6a0 487d ffff ffff 0040 0000 002f 0000

Pero esto es lo que veo de mi programa

bytes[0]: 55
bytes[1]: 8
bytes[2]: ffffffc8
bytes[3]: ffffffdd
bytes[4]: 22
bytes[5]: ffffffc8
bytes[6]: ffffff91
bytes[7]: 63
bytes[8]: ffffff82

Mi suposición obvia es que estoy abordando algo incorrectamente y recibiendo los datos incorrectos o los imprimo incorrectamente y lo veo de la manera incorrecta.

¿Fue útil?

Solución

Estás leyendo fragmentos sucesivos de 512 bytes de su archivo cada vez que redondean el bucle e imprimiendo solo un byte de cada fragmento. Es posible que desee leer esos 512 bytes de una vez, luego imprimirlos después, así:

fread(&bytes, sizeof(bytes), 1, fp);
for(i = 0;i < 512;i++) {
    printf("bytes[%d]: %x\n", i, bytes[i]);
}

(Además: algunos errores de comprobación no se irían mal, y como señala DAV, debe verificar que realmente esté leyendo el número esperado de bytes del archivo).

Otros consejos

Richiehindle ya ha resuelto la mayor parte del problema, ahora me gustaría ayudar con la parte menor.

Cuando imprime los resultados, su chars se están extendiendo a ints. Para un número positivo, esto no importa, pero para un número negativo (cualquier cosa> = 0x80) obtienes un montón de bits de signo insertados al principio. Es fácil de arreglar:

printf("bytes[%d]: %x\n", i, bytes[i] & 0xff); 

Nota adicional. Hay un error fuera de uno en el bucle, está imprimiendo 513 elementos.

Un par de comentarios:

1) Tiene Fread en un bucle que ejecuta 512 veces y está leyendo 512 bytes cada vez. Mueva el Fread fuera del bucle y léelo de una vez o cambie el parámetro 2 a Fread al tamaño de int si desea leerlo en el bucle.

2) No está verificando el número de bytes que realmente leen o si los archivos se abrieron correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top