繁体   English   中英

如何读取二进制文件的整个64个字节?

[英]How do I read the whole 64 bytes of a binary file?

我正在编写一个小程序,该程序读取二进制文件中的磁盘映像文件,然后检查其分区条目表以显示每个分区,分区的类型,起始扇区和大小。

到目前为止,它可以准确地读取前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;
}

您不必要地使程序变得不可读且难以调试。 您可以一次读取整个引导扇区,然后显示所需的内容。 这是我的简单示例(它不检查文件是否存在,有些人可能抱怨它应该对某些字段使用memcpy等)

#include <iostream>
#include <fstream>
#include <cstdint>
#include <cstddef>
#include <iomanip>

using namespace std;

struct partition_t {
    uint8_t  status;
    uint8_t  start_CHS[3];
    uint8_t  type;
    uint8_t  end_CHS[3];
    uint32_t start_LBA;
    uint32_t size_LBA;
} __attribute__((packed));

struct mbr_t
{
    uint8_t     bootstrap[446];
    partition_t partitions[4];
    uint16_t    signature;
} __attribute__((packed));

int main(int argc, char *argv[])
{
    mbr_t mbr;
    ifstream diskimage;
    diskimage.open( "/tmp/mbr.dd", ios::in | ios::binary );
    diskimage.read( reinterpret_cast<char*>(&mbr), sizeof(mbr) );
    diskimage.close();

    for( int idx = 0 ; idx < 4 ; idx++ )
    {
      string bootable = (mbr.partitions[idx].status == 128) ? "yes" : "no";
      cout << " bootable : " <<  setw(5) << bootable << 
              " type : " << setw(5) << (int)mbr.partitions[idx].type << 
              " start LBA : " << setw(10) << mbr.partitions[idx].start_LBA << 
              " size : " << setw(10) << mbr.partitions[idx].size_LBA << endl;
    }

    return 0;
}

更容易阅读,对不对?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM