CS50 - 恢复 - 操纵 Card.raw PSET3
CS50 - Recovery - Manipulating Card.raw PSET3
所以我是一个新手,正在努力(真的淹死)C,努力通过 CS50。我正在进行 'Recover' 练习,试图从 card.raw 文件中恢复 jpeg。通过谷歌搜索,我了解到通过在终端中键入 xxd -l 2400 card.raw(char 是 'L'),我可以在终端中显示 0-2384 字节,格式如下:
0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ...............
0000950: 0fe0 c11b e555 8f20 33cc fbfe 559e 8eee .....U. 3...你...
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);
}
有几个重大问题。首先声明char text[32];
。回想一下 char
有一个非常具体的含义,它被评估为从 0 到 255 的整数;它是 "signed"。这非常适合阅读 ascii 文本。 Recall/review bmp.h 来自 resize
以查看应如何声明数据以读取 非 ascii 文本的数据,例如图像数据。
-- edit -- 二进制数据需要是 "unsigned" 数据类型。在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
是十六进制的说明符)。
感谢 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;
}
所以我是一个新手,正在努力(真的淹死)C,努力通过 CS50。我正在进行 'Recover' 练习,试图从 card.raw 文件中恢复 jpeg。通过谷歌搜索,我了解到通过在终端中键入 xxd -l 2400 card.raw(char 是 'L'),我可以在终端中显示 0-2384 字节,格式如下:
0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ...............
0000950: 0fe0 c11b e555 8f20 33cc fbfe 559e 8eee .....U. 3...你...
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);
}
有几个重大问题。首先声明char text[32];
。回想一下 char
有一个非常具体的含义,它被评估为从 0 到 255 的整数;它是 "signed"。这非常适合阅读 ascii 文本。 Recall/review bmp.h 来自 resize
以查看应如何声明数据以读取 非 ascii 文本的数据,例如图像数据。
-- edit -- 二进制数据需要是 "unsigned" 数据类型。在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
是十六进制的说明符)。
感谢 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;
}