【发布时间】:2017-08-15 19:00:48
【问题描述】:
我正在编写一个小程序,它以二进制形式读取磁盘映像文件,然后检查其分区条目表以显示每个分区、它的类型、起始扇区和大小。
到目前为止,它准确地读取了前 16 个字节,但其余的分区条目无法识别或出现某种错误。 结果如下所示: 编辑:输出的第一行应该是这样的:
`Partition 0: Type: FAT-16 Start: 63 Size: 518760`
我错过了什么?如何修复代码以使所有分区条目都给出适当的结果?
using namespace std;
#include <iostream>
#include <fstream>
struct Partition { char type; int start_sect; int size; } part_entry[4]; // 4 x partition table entry
int main(int argc, char *argv[])
{
//DECLARATIONS
int i, offset = 26, not_exist = 0;
char buf_part_table[64], vol_type[12];
char* diskdata;
int n;
streampos begin, end;
ifstream diskimage;
diskimage.open("Sample_1.dd", ios::in | ios::binary | ios::out);
diskdata = new char[begin];
begin = diskimage.tellg();
diskdata = new char[begin];
diskimage.seekg(446, ios::beg);
diskimage.read(buf_part_table, 64);
for (i = 0; i < 4; i++)
{
part_entry[i].type = *(char*)(buf_part_table + 0x04 + (i * offset));
if (part_entry[i].type == 0) not_exist++;
part_entry[i].start_sect = *(int*)(buf_part_table + 0x08 + (i * offset));
part_entry[i].size = *(int*)(buf_part_table + 0x0C + (i * offset));
switch (part_entry[i].type)
{
case 00: strcpy(vol_type, "NOT-VALID");
break;
case 06: strcpy(vol_type, "FAT-16");
break;
case 07: strcpy(vol_type, "NTFS");
break;
case 0x0B: strcpy(vol_type, "FAT-32");
break;
default: strcpy(vol_type, "NOT-DECODED");
break;
}
cout << "Partition " << i << ":" << " Type:" << vol_type << " Start: " << part_entry[i].start_sect << " Size: " << part_entry[i].size << endl;
}
return 0;
}
【问题讨论】:
-
请不要发布文本图像(尤其是链接),而是将实际文本作为文本复制粘贴到问题的正文中。如果您有意外的输出,它也有助于查看预期输出,而不仅仅是实际输出。
-
buf_part_table + 0xXX + (i * offset)和i == 3远不是 64 个字节。可能是offset应该是 16,而不是 26? -
它如何为您编译,因为它缺少
#include <cstring>? -
struct Partition 将包含填充,这是否与数据的布局相匹配? (int*) 强制转换是未定义的行为(可能不满足对齐要求),请改用 memcpy。
标签: c++ binary partitioning disk istream