CS50 - Восстановление - Манипулирование Card.raw PSET3 - PullRequest
0 голосов
/ 16 февраля 2019

Так что я новичок, борющийся (действительно тонущий) с C, пытающийся пробиться через CS50.Я работаю над упражнением «Восстановление», пытаясь восстановить jpegs из файла card.raw.Благодаря Google, я узнал, что, набрав xxd -l 2400 card.raw (char это 'L') в терминале, я могу отображать байты 0-2384 включительно в терминале, которые имеют следующий формат:

0000000: 0000 0000 0000 0000 0000 0000 0000 ................

0000950: 0fe0 c11b e555 8f20 33cc fbfe 559e 8eee ..... U.3 ... U ...

Q1: я хочу отобразить первые 32 байта (все 0), используя printf (чтобы я мог проверить, что читается).Моя программа компилируется, но ничего не отображается.(Конечно, как только у меня это заработает, я изменю его на отображение большего количества байтов, так как я знаю, откуда начинается первый jpeg, просматривая данные в терминале).

Простые ответы приветствуются (если бы я был более опытным, я бы не стал публиковать такие основные вопросы).Спасибо,

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

int main()
{

    // hardcode opening of card.raw in read binary mode
    FILE *infile = fopen("card.raw", "rb");

    if (infile == NULL)
    {
        fprintf(stderr, "Could not open infile"); 
        return 2;
    } 

    // declare a variable to hold data to be read from infile file, note that a size for it must be specified
    char text[32];

    /* go to the beginning of the card.raw file to start reading */
    fseek(infile, 0, SEEK_SET);

    // text is the variable that will hold what is read, declared above
    // how many to read, how many to read at a time, where to read from
    fread(text, 32, 1, infile);
    printf("%s\n", text);
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Благодаря DinoCoderSAurus, с вашей (и некоторой другой помощью) мне удалось выяснить следующее:

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

int main()
{

    // hardcode opening of a file with fopen, in read binary mode
    FILE *infile = fopen("card.raw", "rb");
    // error check, did file open?
    if (infile == NULL)
    {
        fprintf(stderr, "Could not open infile"); 
        return 2;
    }

    // because card.raw contains binary/hex data, must use unsigned char to hold data, 32 bytes chosen at random
    unsigned char dataval[32];

    //    dataval is the variable that will hold what is read, declared above
    //          how many to read, how many to read at a time, where to read from
    fread(dataval, 1, 32, infile);

    //Print bytes (from dataval) one at a time
    for (int i = 0; i < 32; i++)
    {
        printf("%02X ", (int)dataval[i]);
    }
    printf("\n");

    return 0;
}
0 голосов
/ 17 февраля 2019

Есть несколько существенных проблем.Сначала это объявление char text[32];.Напомним, что char имеет очень специфическое значение, оно оценивается как целые числа от 0 до 255;это "подписано".Это идеально подходит для чтения текста ASCII.Извлеките / просмотрите файл bmp.h из resize, чтобы узнать, как следует объявлять данные для чтения данных, которые не текст ascii, например данные изображения.

- редактирование - Потребности в двоичных данныхбыть "беззнаковым" типом данных.В bmp.h автор использовал uint8_t здесь typedef uint8_t BYTE; (что требует #include stdint.h>).Вы можете использовать
unsigned char text[32]

Во-вторых, это printf("%s\n", text);.text объявлен массив символов.Но помните, что делает строку строкой?Это завершающий нулевой байт, технически 0.Поэтому, когда вы просите printf вывести text в виде строки, она напечатает все, вплоть до первого нулевого байта (0).Который, как вы можете видеть из своего шестнадцатеричного дампа, является первым байтом в файле.

- edit-- Поскольку вы не можете использовать строковый формат в printf, вы можете печатать выходной символ по одному за раз, очень похоже на Марио или Цезаря.Однако, поскольку он без знака, строка формата будет %u вместо %c.Вы можете увидеть его в шестнадцатеричном формате со строкой формата %04x (x - это спецификатор для шестнадцатеричного числа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...