我有一个磁盘映像,其中包含使用保险丝的标准映像。Superblock 包含以下内容,我有一个函数 read_superblock(*buf) 返回以下原始数据:
Bytes 0-3: Magic Number (0xC0000112)
4-7: Block Size (1024)
8-11: Total file system size (in blocks)
12-15: FAT length (in blocks)
16-19: Root Directory (block number)
20-1023: NOT USED
Run Code Online (Sandbox Code Playgroud)
我对 C 非常陌生,为了让我开始这个项目,我很好奇有什么简单的方法可以将它读入结构或一些变量中,然后使用 printf 将它们打印到屏幕上进行调试。
我最初想做类似以下的事情,认为我可以看到原始数据,但我认为情况并非如此。也没有结构,我试图将它作为一个字符串读入,这似乎也是非常错误的。让我从中抓取数据。有没有办法让我指定结构并定义每个变量中的字节数?
char *buf;
read_superblock(*buf);
printf("%s", buf);
Run Code Online (Sandbox Code Playgroud)
是的,我认为你最好把它读成一个结构。包含有用数据的字段都是 32 位整数,因此您可以定义如下所示的结构(使用标准头文件中定义的类型stdint.h):
typedef struct SuperBlock_Struct {
uint32_t magic_number;
uint32_t block_size;
uint32_t fs_size;
uint32_t fat_length;
uint32_t root_dir;
} SuperBlock_t;
Run Code Online (Sandbox Code Playgroud)
您可以char*在调用时将结构转换为 a read_superblock,如下所示:
SuperBlock_t sb;
read_superblock((char*) &sb);
Run Code Online (Sandbox Code Playgroud)
现在要打印出您的数据,您可以进行如下调用:
printf("%d %d %d %d\n",
sb.magic_number,
sb.block_size,
sb.fs_size,
sb.fat_length,
sb.root_dir);
Run Code Online (Sandbox Code Playgroud)
请注意,在使用此类技术时,您需要注意平台的字节序,因为您正在读取整数数据(即,您可能需要在读取数据时交换字节)。您应该能够使用第一个字段中的幻数快速确定。
请注意,通常最好传递这样的结构而不进行转换;这允许您利用编译器的类型检查并消除转换可能隐藏的潜在问题。但是,这需要更改您的实现read_superblock以将数据直接读入结构中。这并不难,可以使用标准的 C 运行时函数来完成fread(假设您的数据在一个文件中,如您的问题所暗示的那样),如下所示:
fread(&sb.magic_number, sizeof(sb.magic_number), 1, fp);
fread(&sb.block_size, sizeof(sb.block_size), 1, fp);
...
Run Code Online (Sandbox Code Playgroud)