CS50-恢复-操纵Card.raw PSET3

时间:2019-02-16 17:56:18

标签: c cs50 recover

所以我是一个新手,正在C中苦苦挣扎(真的很困),试图通过CS50努力工作。我正在进行“恢复”练习,试图从card.raw文件中恢复jpeg。通过Googling,我了解到,通过在终端中键入xxd -l 2400 card.raw(字符为“ L”),我可以在终端中显示0-2384字节(包括首尾),格式如下:

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

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

Q1:我想使用printf显示前32个字节(全0)(以便我可以验证正在读取的内容)。我的程序可以编译,但是什么也不显示。 (当然,一旦完成此工作,我将其更改为显示更多字节,因为我知道第一个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 :(得分:1)

有两个重大问题。首先,此声明 const onKeyPress = async (e: React.KeyboardEvent<HTMLInputElement>) => { if (e.key === "Enter") { console.log(`Received: ${e.currentTarget.value}`); await doAsyncStuff(e.currentTarget.value); } }; 。回想一下char text[32];的含义非常明确,它的取值范围是0到255之间的整数;它是“签名”。这是阅读ascii文本的完美选择。从char调用/查看bmp.h,以了解应如何声明数据以读取不是 ascii文本的数据,例如图像数据。

-编辑-二进制数据必须是“无符号”数据类型。在bmp.h中,作者在resize处使用uint8_t(需要typedef uint8_t BYTE;)。你可以用
 #include stdint.h>

第二个unsigned char text[32]printf("%s\n", text);被声明为一个字符数组。但是还记得使字符串变成字符串的事情吗?从技术上讲,它是终止的空字节text。因此,当您要求printf将0打印为字符串时,它将打印所有内容,直到第一个空字节(text)。从十六进制转储中可以看到,它是文件中的第一个字节。

-edit--由于不能在printf中使用字符串格式,因此可以一次输出一个字符,就像mario或caesar。但是,由于它是无符号的,所以格式字符串将是0而不是%u。您可以使用格式为%c的十六进制格式查看它(%04x是十六进制的说明符)。

答案 1 :(得分:0)

感谢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;
}