ISO镜像本身不是某种数据格式,只不过是逐个复制一张光盘上的数据扇区。ISO也可以被释放的驱动程序软件「挂载」,模拟出一个物理硬盘让操作系统读取。
MBR
master boot record(主引导记录):是硬盘的第一个扇区,第一个扇区也叫做mbr扇区。
| 偏移地址 | 字节数 | 内容 |
|---|---|---|
| 00 | 446 | 启动代码 |
| 446 | 16 | 第1分区表项 |
| 462 | 16 | 第2分区表项 |
| 478 | 16 | 第3分区表项 |
| 494 | 16 | 第4分区表项 |
| 510 | 2 | 签名(0x55 0xAA) |
看上边的结构图可以看到,一个mbr分区的大小就是512字节。其中包括446字节的启动代码,4x16的四个分区表项,最后是两个字节的签名。也就是要确定一个iso是不是mbr类型的镜像,打开ISO文件,偏移510字节,再读俩字节,这俩字节中的内容如果是「0x55 0xAA」,那么这就是一个mbr类型的镜像。
编程实现部分:
boolPage1::checkISO(const QString fileName){// Check if there's an MBR signature// MBR signature will be in last two bytes of the boot recordQByteArray mbr;QFile mbrTest(fileName);mbrTest.open(QIODevice::ReadOnly);mbrTest.seek(510);mbr = mbrTest.read(2);mbrTest.close();if (mbr.toHex() != "55aa"){ //MBR signature "55aa"qDebug()<<"wrong iso,filename = "<<fileName<<"MBR signature = "<<mbr.toHex();return false;}return true;}
GPT

再看GPT,第一个扇区是PMBR,格式与mbr相同。
偏移上一个扇区,也就是偏移上512kb之后,就是GPT Header,也是512K之后接下来的512K,就是GPT Header的部分,GPT Header的内容如下:
偏移512k之后读上8k转string,内容为「EFI PART」则代表这是一个GPT分区。内容基本一致,就不编码了。
