c++ - 将 super block 读入 C 结构

标签 c++ c fuse

我有一个磁盘镜像,其中包含一个使用 fuse 的标准镜像。 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

我是 C 的新手,为了让我开始这个项目,我很好奇将其读入结构或某些变量并使用 printf 将它们简单地打印到屏幕上进行调试的简单方法是什么。

我最初想做类似下面的事情,我认为我可以看到原始数据,但我认为情况并非如此。也没有结构,我试图将其作为字符串读入,这似乎也非常错误。让我从中获取数据。有没有办法让我指定结构并定义每个变量中的字节数?

char *buf;
read_superblock(*buf);
printf("%s", buf);

最佳答案

是的,我认为您最好将其读入结构。包含有用数据的字段都是 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;

调用 read_superblock 时,您可以将结构转换为 char*,如下所示:

SuperBlock_t sb;
read_superblock((char*) &sb);

现在要打印出你的数据,你可以像下面这样调用:

printf("%d %d %d %d\n",
  sb.magic_number,
  sb.block_size,
  sb.fs_size,
  sb.fat_length,
  sb.root_dir);

请注意,在使用此类技术时,您需要注意平台的字节顺序,因为您正在读取整数数据(即,您可能需要在读取数据时交换字节)。您应该能够使用第一个字段中的魔数(Magic Number)快速确定。

请注意,通常最好传递这样的结构而不强制转换它;这使您可以利用编译器的类型检查并消除转换可能隐藏的潜在问题。但是,这需要更改 read_superblock 的实现以将数据直接读取到结构中。这并不困难,可以使用标准 C 运行时函数 fread 来完成(假设您的数据在文件中,正如您的问题中所暗示的那样),如下所示:

fread(&sb.magic_number, sizeof(sb.magic_number), 1, fp);
fread(&sb.block_size, sizeof(sb.block_size), 1, fp);
...

关于c++ - 将 super block 读入 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1864103/

相关文章:

android - 如何融合位置在后台服务中连续运行

fuse - 在 FUSE 的 truncate() 中获取 fuse_file_info

c++ - 错误 : cast from 'Foo*' to 'unsigned int' loses precision

c++ - 为什么 64 位 GCC 在分配数组时警告将 const int 转换为 long unsigned int?

c++ - 将 double 的位模式显示为十六进制?

c - 将 GCC 移植到 Multiclet

c - 可能知道变量所在的内存部分?

c++ - 为什么 C++ 需要析构函数?

c++ - 迭代某个类的 vector 列表 (C++)

sshfs EBCDIC 转 ASCII