JAVA——构建FAT32文件系统的DBR(DOS引导记录)类
Maven
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
解决方案
方案一
package cn.edu.zstu.fms.storage;import lombok.Data;/*** 是DOS引导记录,也称为操作系统引导记录,在DBR之后往往会有一些保留扇区。* @see <a href="https://blog.51cto.com/dengqi/1349327">FAT32文件系统详解</a>* @author ShenTuZhiGang* @version 1.0.0* @date 2020-12-29 18:28*/
@Data
public class DOSBootRecord {/*** 跳转指令 开始字节位置*/public static final int JUMP_COMMAND_START =0;/*** 跳转指令 长度*/public static final int JUMP_COMMAND_LENGTH =2;/*** OEM代号 开始字节位置*/public static final int OEM_CODE_START =3;/*** OEM代号 长度*/public static final int OEM_CODE_LENGTH =8;/*** BPB 开始字节位置*/public static final int BIOS_PARAMETER_BLOCK_START = 11;/*** BPB 长度*/public static final int BIOS_PARAMETER_BLOCK_LENGTH =79;/*** 引导程序代码 开始字节位置*/public static final int BOOTLOADER_CODE_START = 90;/*** 引导程序代码 长度*/public static final int BOOTLOADER_CODE_LENGTH =420;/*** BPB 开始字节位置*/public static final int END_SIGN_START = 510;/*** 结束标志 长度*/public static final int END_SIGN_LENGTH =2;/*** 源数据*/private byte[] source;/*** 跳转指令* 占2字节,它将程序执行流程跳转到引导程序处。* 跳转指令后,一条空的指令NOP(90H)* @see <a href="https://blog.csdn.net/pnzrk/article/details/88943746">FAT32</a>*/private byte[] jumpCommand = new byte[2];/*** OEM代号* 占8字节,其内容由创建该文件系统的OEM厂商具体安排。*/private byte[] oemCode = new byte[8];/*** BPB BIOS参数块* BIOS Parameter Block* FAT32的BPB从DBR的第12个字节开始,占用79字节,记录了有关该文件系统的重要信息*/private BIOSParameterBlock biosParameterBlock;/*** 引导程序代码* FAT32的DBR引导程序占用420字节,对于没有安装操作系统的分区来说这段程序是没有用处的。*/private byte[] bootloaderCode = new byte[420];/*** 结束标志* 0xAA55*/private byte[] endSign = new byte[2];/**** @param source*/public DOSBootRecord(byte[] source){this.source = source;//跳转指令jumpCommand = new byte[JUMP_COMMAND_LENGTH];System.arraycopy(this.source, JUMP_COMMAND_START, jumpCommand, 0, JUMP_COMMAND_LENGTH);//OEM代号oemCode = new byte[OEM_CODE_LENGTH];System.arraycopy(this.source, OEM_CODE_START, oemCode, 0, OEM_CODE_LENGTH);//BIOS参数块byte[] biosParameterBlockSource = new byte[BIOS_PARAMETER_BLOCK_LENGTH];System.arraycopy(this.source, BIOS_PARAMETER_BLOCK_START, biosParameterBlockSource, 0, BIOS_PARAMETER_BLOCK_LENGTH);this.biosParameterBlock = new BIOSParameterBlock(biosParameterBlockSource);//引导程序代码bootloaderCode = new byte[BOOTLOADER_CODE_LENGTH];System.arraycopy(this.source, BOOTLOADER_CODE_START, bootloaderCode, 0, BOOTLOADER_CODE_LENGTH);//结束标志endSign = new byte[END_SIGN_LENGTH];System.arraycopy(this.source, END_SIGN_START, endSign, 0, END_SIGN_LENGTH);}
}
package cn.edu.zstu.fms.storage;import lombok.Data;import java.io.Serializable;
import java.nio.charset.Charset;/*** BIOS参数块* BIOS Parameter Block* FAT32的BPB从DBR的第12个字节开始,占用79字节,记录了有关该文件系统的重要信息* @see <a href="https://blog.csdn.net/pnzrk/article/details/88943746">FAT32</a>* @author ShenTuZhiGang* @version 1.0.0* @date 2020-12-29 19:23*/
@Data
public class BIOSParameterBlock implements Serializable {/** 字节偏移*//*** 每扇区字节数 字节偏移*/public static final Byte SECTOR_BYTE_NUM_OFFSET_POSITION = 0x0B - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 每簇扇区数 字节偏移*/public static final Byte CLUSTER_SECTOR_NUM_OFFSET_POSITION = 0x0D - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** DOS保留扇区数 字节偏移*/public static final Byte DOS_RESERVED_SECTOR_NUM_OFFSET_POSITION = 0x1E - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** FAT个数 字节偏移*/public static final Byte FILE_ALLOCATION_TABLE_NUM_OFFSET_POSITION = 0x10 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 未用 字节偏移*/public static final Byte UNUSED_1_OFFSET_POSITION = 0x11 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 未用 字节偏移*/public static final Byte UNUSED_2_OFFSET_POSITION = 0x13 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 介质描述符 字节偏移*/public static final Byte MEDIA_DESCRIPTOR_OFFSET_POSITION = 0x15 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 未用 字节偏移*/public static final Byte UNUSED_3_OFFSET_POSITION = 0x16 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 每磁道扇区数 字节偏移*/public static final Byte TRACK_SECTOR_NUM_OFFSET_POSITION = 0x18 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 磁头数 字节偏移*/public static final Byte HEAD_NUM_OFFSET_POSITION = 0x1A - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 隐藏扇区数 字节偏移*/public static final Byte HIDDEN_SECTOR_OFFSET_POSITION = 0x1C - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 分区扇区总数 字节偏移*/public static final Byte PARTITION_SECTOR_NUM_OFFSET_POSITION = 0x20 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/** 扩展BPB*//*** 每FAT扇区数 字节偏移*/public static final Byte FAT_SECTOR_NUM_OFFSET_POSITION = 0x24 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 标记 字节偏移*/public static final Byte SIGN_OFFSET_POSITION = 0x28 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 版本 字节偏移*/public static final Byte VERSION_OFFSET_POSITION = 0x2A - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 根目录首簇号 字节偏移*/public static final Byte ROOT_CLUSTER_NUMBER_OFFSET_POSITION = 0x2C - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 文件系统信息扇区号 字节偏移*/public static final Byte FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_OFFSET_POSITION = 0x30 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** DBR备份扇区号 字节偏移*/public static final Byte BACKUP_SECTOR_NUMBER_OFFSET_POSITION = 0x32 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 保留 字节偏移*/public static final Byte RETAIN_OFFSET_POSITION = 0x34 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** BIOS驱动器号 字节偏移*/public static final Byte bios_Drive_Number_OFFSET_POSITION = 0x40 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 未用 字节偏移*/public static final Byte extend_Boot_Flag_OFFSET_POSITION = 0x41 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 扩展引导标记 字节偏移*/public static final Byte UNUSED_4_OFFSET_POSITION = 0x42 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 卷序列号 字节偏移*/public static final Byte VOLUME_SERIAL_NUMBER_OFFSET_POSITION = 0x43 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 卷标 字节偏移*/public static final Byte VOLUME_LABEL_OFFSET_POSITION = 0x47 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/*** 文件系统类型 字节偏移*/public static final Byte FILE_SYSTEM_TYPE_OFFSET_POSITION = 0x52 - DOSBootRecord.BIOS_PARAMETER_BLOCK_START;/** 长度*//*** 每扇区字节数 长度*/public static final Byte SECTOR_BYTE_NUM_LENGTH = 2;/*** 每簇扇区数 长度*/public static final Byte CLUSTER_SECTOR_NUM_LENGTH = 1;/*** DOS保留扇区数 长度*/public static final Byte DOS_RESERVED_SECTOR_NUM_LENGTH = 2;/*** FAT个数 长度*/public static final Byte FILE_ALLOCATION_TABLE_NUM_LENGTH = 1;/*** 未用 长度*/public static final Byte UNUSED_1_LENGTH = 2;/*** 未用 长度*/public static final Byte UNUSED_2_LENGTH = 2;/*** 介质描述符 长度*/public static final Byte MEDIA_DESCRIPTOR_LENGTH = 1;/*** 未用 长度*/public static final Byte UNUSED_3_LENGTH = 2;/*** 每磁道扇区数 长度*/public static final Byte TRACK_SECTOR_NUM_LENGTH = 2;/*** 磁头数 长度*/public static final Byte HEAD_NUM_LENGTH = 2;/*** 隐藏扇区数 长度*/public static final Byte HIDDEN_SECTOR_LENGTH = 4;/*** 分区扇区总数 长度*/public static final Byte PARTITION_SECTOR_NUM_LENGTH = 4;/** 扩展BPB*//*** 每FAT扇区数 长度*/public static final Byte FAT_SECTOR_NUM_LENGTH = 4;/*** 标记 长度*/public static final Byte SIGN_LENGTH = 2;/*** 版本 长度*/public static final Byte VERSION_LENGTH = 2;/*** 根目录首簇号 长度*/public static final Byte ROOT_CLUSTER_NUMBER_LENGTH = 4;/*** 文件系统信息扇区号 长度*/public static final Byte FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_LENGTH = 2;/*** DBR备份扇区号 长度*/public static final Byte BACKUP_SECTOR_NUMBER_LENGTH = 2;/*** 保留 长度*/public static final Byte RETAIN_LENGTH = 12;/*** BIOS驱动器号 长度*/public static final Byte bios_Drive_Number_LENGTH = 1;/*** 未用 长度*/public static final Byte extend_Boot_Flag_LENGTH = 1;/*** 扩展引导标记 长度*/public static final Byte UNUSED_4_LENGTH = 1;/*** 卷序列号 长度*/public static final Byte VOLUME_SERIAL_NUMBER_LENGTH = 4;/*** 卷标 长度*/public static final Byte VOLUME_LABEL_LENGTH = 11;/*** 文件系统类型 长度*/public static final Byte FILE_SYSTEM_TYPE_LENGTH = 8;/*** 源数据*/private byte[] source;/*** 每扇区字节数* 字节偏移 0x0B* 长度 2个字节* 记录每个逻辑扇区的大小,其常见的值为512,但是并不是固定的值。* 该值可以由程序定义,合法值包括512、1024、2048、4096。*/private Short sectorByteNum;/*** 每簇扇区数* 字节偏移 0x0D* 长度 1个字节* 记录着文件系统的簇大小,即由多少个扇区组成一个簇。* 簇是FAT12,FAT16及FAT32文件系统下数据的最小存储单元,* 一个簇由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂,* 如1,2,4,8,16,32,64,128.* 在Windows 2000以前族最大值为64扇区,之后最大值为128。* 在FAT文件系统中,所有的簇是从2开始编号,* 每个簇都有一个自己的地址编号,* 但是所有的簇都位于数据区,在数据区之前没有簇。*/private Byte clusterSectorNum;/*** DOS保留扇区数* 字节偏移 0x0E* 长度 1个字节* DBR到FAT1表之间的扇区数,或者说是FAT1的开始扇区号,对于FAT32文件系统来说,该值的范围是32扇区到38扇区之间。*/private Short dosReservedSectorNum;/*** FAT个数* 字节偏移 0x10* 长度 1个字节* 一般为2*/private Byte FATNum;/*** 介质描述符* 字节偏移 0x15* 长度 1个字节* 描述磁盘介质的参数,根据磁盘性质的不同,取不同的值。0xF8标准值,可移动存储介质,常用 0xF0*/private Byte mediaDescriptor;/*** 每磁道扇区数* 字节偏移 0x18* 长度 1个字节* 一般其值为63*/private Short trackSectorNum;/*** 磁头数* 字节偏移 0x1A* 长度 1个字节* 一般为255*/private Short headNum;/*** 隐藏扇区数* 字节偏移 0x1C* 长度 1个字节* 是MBR到DBR之间的扇区数,对于扩展分区中逻辑驱动顺来说,是其EBR到DBR。可以为0。*/private Integer hiddenSector;/*** 分区扇区总数* 字节偏移 0x20* 长度 4个字节* 分区的总扇区数,也就是FAT32分区的大小*/private Integer partitionSectorNum;/** 扩展BPB*//*** 每FAT扇区数* 字节偏移 0x24* 长度 1个字节* FAT表占用扇区数*/private Integer FATSectorNum;/*** 标记* 字节偏移 0x28* 长度 1个字节* FAT32是否可用,2为可用,此域FAT32 特有*/private Short sign;/*** 版本* 字节偏移 0x2A* 长度 1个字节* FAT32版本号0.0,FAT32特有*/private Short version;/*** 根目录首簇号* 字节偏移 0x2C* 长度 4个字节* 分区在格式化的时候,* 格式化程序会在数据区中指派一个簇作为FAT32的根目录的开始,并把该簇号记录在BPB中。* 通常都是把数据区中的第一簇分配给根目录使用,也就是2号簇。*/private Integer rootClusterNumber;/*** 文件系统信息扇区号* 字节偏移 0x30* 长度 2个字节* FAT32文件系统在DBR的保留扇区中安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个可用的空闲簇的簇号,* 该扇区一般在分区的1号扇区,也就是紧跟在DBR之后的一个扇区。* FSINFO(文件系统信息扇区)扇区号1,该扇区为操作系统提供关于空簇总数及下一可用簇的信息*/private Short fileSystemInformationSectorNumber;/*** DBR备份扇区号* 字节偏移 0x32* 长度 2个字节* FAT32文件系统在DBR的保留扇区中安排了一个DBR的备份,* 一般在6号扇区,也就是分区的第7个扇区,该备份扇区与原DBR扇区的内容完全一样,如果原DBR遭到破坏,可以用备份扇区号修复。*/private Short backupSectorNumber;/*** BIOS驱动器号* 字节偏移 0x40* 长度 1个字节* 这是BIOS的INT 13H所描述的设备号码,一般硬盘为80H,一般软盘为00H等*/private Byte biosDriveNumber;/*** 扩展引导标记* 字节偏移 0x41* 长度 1个字节* 用来确认后面的三个参数是否有效,FAT为29H*/private Byte extendBootFlag;/*** 卷序列号* 字节偏移 0x43* 长度 4个字节* 磁盘序列号,通常为一随机数*/private Integer volumeSerialNumber;/*** 卷标* 字节偏移 0x47 {@link cn.edu.zstu.fms.storage.BIOSParameterBlock#VOLUME_LABEL_OFFSET_POSITION }* 长度 11个字节 {@link cn.edu.zstu.fms.storage.BIOSParameterBlock#VOLUME_LABEL_LENGTH }* 用户设置的卷标ASCII,如果没有则4E 4F 20 4E 41 4D 45 20 20 20 20 即NO NAME。如果建立文件系统的时候指定了卷标,会保存在此*/private Character[] volumeLabel;/*** 文件系统类型* 字节偏移 0x52 {@link cn.edu.zstu.fms.storage.BIOSParameterBlock#FILE_SYSTEM_TYPE_OFFSET_POSITION }* 长度 8个字节 {@link cn.edu.zstu.fms.storage.BIOSParameterBlock#FILE_SYSTEM_TYPE_LENGTH }* 使用ASCII码记录当前分区的文件系统类型,46 41 54 33 32 20 20 20即FAT32*/private Character[] fileSystemType;/**** @param source*/public BIOSParameterBlock(byte[] source){this.source = source;}
}class ByteUtil {public static byte[] getBytes(short data) {byte[] bytes = new byte[2];bytes[0] = (byte) (data & 0xff);bytes[1] = (byte) ((data & 0xff00) >> 8);return bytes;}public static byte[] getBytes(char data) {byte[] bytes = new byte[2];bytes[0] = (byte) (data);bytes[1] = (byte) (data >> 8);return bytes;}public static byte[] getBytes(int data) {byte[] bytes = new byte[4];bytes[0] = (byte) (data & 0xff);bytes[1] = (byte) ((data & 0xff00) >> 8);bytes[2] = (byte) ((data & 0xff0000) >> 16);bytes[3] = (byte) ((data & 0xff000000) >> 24);return bytes;}public static byte[] getBytes(long data) {byte[] bytes = new byte[8];bytes[0] = (byte) (data & 0xff);bytes[1] = (byte) ((data >> 8) & 0xff);bytes[2] = (byte) ((data >> 16) & 0xff);bytes[3] = (byte) ((data >> 24) & 0xff);bytes[4] = (byte) ((data >> 32) & 0xff);bytes[5] = (byte) ((data >> 40) & 0xff);bytes[6] = (byte) ((data >> 48) & 0xff);bytes[7] = (byte) ((data >> 56) & 0xff);return bytes;}public static byte[] getBytes(float data) {int intBits = Float.floatToIntBits(data);return getBytes(intBits);}public static byte[] getBytes(double data) {long intBits = Double.doubleToLongBits(data);return getBytes(intBits);}public static byte[] getBytes(String data, String charsetName) {Charset charset = Charset.forName(charsetName);return data.getBytes(charset);}public static byte[] getBytes(String data) {return getBytes(data, "UTF-8");}public static short getShort(byte[] bytes) {return (short) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8)));}public static char getChar(byte[] bytes) {return (char) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8)));}public static int getInt(byte[] bytes) {return (0xff & bytes[0]) | (0xff00 & (bytes[1] << 8)) | (0xff0000 & (bytes[2] << 16)) | (0xff000000 & (bytes[3] << 24));}public static long getLong(byte[] bytes) {return(0xffL & (long)bytes[0]) | (0xff00L & ((long)bytes[1] << 8)) | (0xff0000L & ((long)bytes[2] << 16)) | (0xff000000L & ((long)bytes[3] << 24))| (0xff00000000L & ((long)bytes[4] << 32)) | (0xff0000000000L & ((long)bytes[5] << 40)) | (0xff000000000000L & ((long)bytes[6] << 48)) | (0xff00000000000000L & ((long)bytes[7] << 56));}public static float getFloat(byte[] bytes) {return Float.intBitsToFloat(getInt(bytes));}public static double getDouble(byte[] bytes) {long l = getLong(bytes);System.out.println(l);return Double.longBitsToDouble(l);}public static String getString(byte[] bytes, String charsetName) {return new String(bytes, Charset.forName(charsetName));}public static String getString(byte[] bytes) {return getString(bytes, "UTF-8");}
}
方案二
package cn.edu.zstu.fms.storage;import java.io.Serializable;
import java.nio.charset.Charset;/*** 是DOS引导记录,也称为操作系统引导记录,在DBR之后往往会有一些保留扇区。* @see <a href="https://blog.51cto.com/dengqi/1349327">FAT32文件系统详解</a>* @author ShenTuZhiGang* @version 1.0.0* @date 2020-12-29 18:28*/
public class DOSBootRecord implements Serializable{private static final long serialVersionUID = 1L;/*** DBR大小/字节*/public static final short DOS_BOOT_RECORD_SIZE = 512;/*** 跳转指令 开始字节位置*/public static final short JUMP_COMMAND_START = 0;/*** 跳转指令 长度*/public static final short JUMP_COMMAND_LENGTH = 2;/*** OEM代号 开始字节位置*/public static final short OEM_CODE_START = 3;/*** OEM代号 长度*/public static final short OEM_CODE_LENGTH = 8;/*** BPB 开始字节位置*/public static final short BIOS_PARAMETER_BLOCK_START = 11;/*** BPB 长度*/public static final short BIOS_PARAMETER_BLOCK_LENGTH = 79;/*** 引导程序代码 开始字节位置*/public static final short BOOTLOADER_CODE_START = 90;/*** 引导程序代码 长度*/public static final short BOOTLOADER_CODE_LENGTH = 420;/*** BPB 开始字节位置*/public static final short END_SIGN_START = 510;/*** 结束标志 长度*/public static final short END_SIGN_LENGTH = 2;/*** 源数据*/private byte[] source;/*** 跳转指令* 占2字节,它将程序执行流程跳转到引导程序处。* 跳转指令后,一条空的指令NOP(90H)* @see <a href="https://blog.csdn.net/pnzrk/article/details/88943746">FAT32</a>*/private byte[] jumpCommand = new byte[2];/*** OEM代号* 占8字节,其内容由创建该文件系统的OEM厂商具体安排。*/private byte[] oemCode = new byte[8];/*** BPB BIOS参数块* BIOS Parameter Block* FAT32的BPB从DBR的第12个字节开始,占用79字节,记录了有关该文件系统的重要信息*/private BIOSParameterBlock biosParameterBlock;/*** 引导程序代码* FAT32的DBR引导程序占用420字节,对于没有安装操作系统的分区来说这段程序是没有用处的。*/private byte[] bootloaderCode = new byte[420];/*** 结束标志* 0xAA55*/private byte[] endSign = new byte[2];/*** 构造器*/public DOSBootRecord(){this(new byte[DOS_BOOT_RECORD_SIZE]);}/*** 构造器* @param source*/public DOSBootRecord(byte[] source){this.setSource(source);}public byte[] getSource() {return source;}public void setSource(byte[] source) {this.source = source;//跳转指令this.jumpCommand = extract(JUMP_COMMAND_START, JUMP_COMMAND_LENGTH);//OEM代号this.oemCode = extract(OEM_CODE_START, OEM_CODE_LENGTH);//BIOS参数块this.biosParameterBlock = new BIOSParameterBlock();//引导程序代码this.bootloaderCode = extract(BOOTLOADER_CODE_START, BOOTLOADER_CODE_LENGTH);//结束标志this.endSign = extract(END_SIGN_START, END_SIGN_LENGTH);}public byte[] getJumpCommand() {return jumpCommand;}public void setJumpCommand(byte[] jumpCommand) {this.jumpCommand = jumpCommand;save(this.jumpCommand,JUMP_COMMAND_START, JUMP_COMMAND_LENGTH);}public byte[] getOemCode() {return oemCode;}public void setOemCode(byte[] oemCode) {this.oemCode = oemCode;save(this.oemCode,OEM_CODE_START, OEM_CODE_LENGTH);}public BIOSParameterBlock getBiosParameterBlock() {return biosParameterBlock;}public void setBiosParameterBlock(byte[] biosParameterBlock) {save(biosParameterBlock,BIOS_PARAMETER_BLOCK_START, BIOS_PARAMETER_BLOCK_LENGTH);this.biosParameterBlock = new BIOSParameterBlock();}public byte[] getBootloaderCode() {return bootloaderCode;}public void setBootloaderCode(byte[] bootloaderCode) {this.bootloaderCode = bootloaderCode;save(this.bootloaderCode,BOOTLOADER_CODE_START, BOOTLOADER_CODE_LENGTH);}public byte[] getEndSign() {return endSign;}public void setEndSign(byte[] endSign) {this.endSign = endSign;save(this.endSign,END_SIGN_START, END_SIGN_LENGTH);}@Overridepublic String toString() {String res = "";for (int i = 0; i < this.source.length; i++) {String temp = Integer.toHexString(this.source[i] & 0xFF);res = res + ((temp.length() == 1)?"0" + temp:"" + temp) + (i==this.source.length - 1?"":((i+1)%16==0?"\n":"\t"));}return res;}/*** BIOS参数块* BIOS Parameter Block* FAT32的BPB从DBR的第12个字节开始,占用79字节,记录了有关该文件系统的重要信息* @see <a href="https://blog.csdn.net/pnzrk/article/details/88943746">FAT32</a>* @author ShenTuZhiGang* @version 1.0.0* @date 2020-12-29 19:23*/public class BIOSParameterBlock implements Serializable {private static final long serialVersionUID = 1L;/** 字节偏移*//*** 每扇区字节数 字节偏移*/public static final short SECTOR_BYTE_NUM_OFFSET_POSITION = 0x0B ;/*** 每簇扇区数 字节偏移*/public static final short CLUSTER_SECTOR_NUM_OFFSET_POSITION = 0x0D ;/*** DBR保留扇区数 字节偏移*/public static final short DBR_RESERVED_SECTOR_NUM_OFFSET_POSITION = 0x1E ;/*** FAT个数 字节偏移*/public static final short FAT_NUM_OFFSET_POSITION = 0x10 ;/*** 未用 字节偏移*/public static final short UNUSED_1_OFFSET_POSITION = 0x11 ;/*** 未用 字节偏移*/public static final short UNUSED_2_OFFSET_POSITION = 0x13 ;/*** 介质描述符 字节偏移*/public static final short MEDIA_DESCRIPTOR_OFFSET_POSITION = 0x15 ;/*** 未用 字节偏移*/public static final short UNUSED_3_OFFSET_POSITION = 0x16 ;/*** 每磁道扇区数 字节偏移*/public static final short TRACK_SECTOR_NUM_OFFSET_POSITION = 0x18 ;/*** 磁头数 字节偏移*/public static final short HEAD_NUM_OFFSET_POSITION = 0x1A ;/*** 隐藏扇区数 字节偏移*/public static final short HIDDEN_SECTOR_OFFSET_POSITION = 0x1C ;/*** 分区扇区总数 字节偏移*/public static final short PARTITION_SECTOR_NUM_OFFSET_POSITION = 0x20 ;/** 扩展BPB 字节偏移*//*** 每FAT扇区数 字节偏移*/public static final short FAT_SECTOR_NUM_OFFSET_POSITION = 0x24 ;/*** 标记 字节偏移*/public static final short SIGN_OFFSET_POSITION = 0x28 ;/*** 版本 字节偏移*/public static final short VERSION_OFFSET_POSITION = 0x2A ;/*** 根目录首簇号 字节偏移*/public static final short ROOT_CLUSTER_NUMBER_OFFSET_POSITION = 0x2C ;/*** 文件系统信息扇区号 字节偏移*/public static final short FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_OFFSET_POSITION = 0x30 ;/*** DBR备份扇区号 字节偏移*/public static final short BACKUP_SECTOR_NUMBER_OFFSET_POSITION = 0x32 ;/*** 保留 字节偏移*/public static final short RETAIN_OFFSET_POSITION = 0x34 ;/*** BIOS驱动器号 字节偏移*/public static final short BIOS_DRIVE_NUMBER_OFFSET_POSITION = 0x40 ;/*** 未用 字节偏移*/public static final short EXTEND_BOOT_FLAG_OFFSET_POSITION = 0x41 ;/*** 扩展引导标记 字节偏移*/public static final short UNUSED_4_OFFSET_POSITION = 0x42 ;/*** 卷序列号 字节偏移*/public static final short VOLUME_SERIAL_NUMBER_OFFSET_POSITION = 0x43 ;/*** 卷标 字节偏移*/public static final short VOLUME_LABEL_OFFSET_POSITION = 0x47 ;/*** 文件系统类型 字节偏移*/public static final short FILE_SYSTEM_TYPE_OFFSET_POSITION = 0x52 ;/** 长度*//*** 每扇区字节数 长度*/public static final short SECTOR_BYTE_NUM_LENGTH = 2;/*** 每簇扇区数 长度*/public static final short CLUSTER_SECTOR_NUM_LENGTH = 1;/*** DBR保留扇区数 长度*/public static final short DBR_RESERVED_SECTOR_NUM_LENGTH = 2;/*** FAT个数 长度*/public static final short FAT_NUM_LENGTH = 1;/*** 未用 长度*/public static final short UNUSED_1_LENGTH = 2;/*** 未用 长度*/public static final short UNUSED_2_LENGTH = 2;/*** 介质描述符 长度*/public static final short MEDIA_DESCRIPTOR_LENGTH = 1;/*** 未用 长度*/public static final short UNUSED_3_LENGTH = 2;/*** 每磁道扇区数 长度*/public static final short TRACK_SECTOR_NUM_LENGTH = 2;/*** 磁头数 长度*/public static final short HEAD_NUM_LENGTH = 2;/*** 隐藏扇区数 长度*/public static final short HIDDEN_SECTOR_LENGTH = 4;/*** 分区扇区总数 长度*/public static final short PARTITION_SECTOR_NUM_LENGTH = 4;/** 扩展BPB 长度*//*** 每FAT扇区数 长度*/public static final short FAT_SECTOR_NUM_LENGTH = 4;/*** 标记 长度*/public static final short SIGN_LENGTH = 2;/*** 版本 长度*/public static final short VERSION_LENGTH = 2;/*** 根目录首簇号 长度*/public static final short ROOT_CLUSTER_NUMBER_LENGTH = 4;/*** 文件系统信息扇区号 长度*/public static final short FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_LENGTH = 2;/*** DBR备份扇区号 长度*/public static final short BACKUP_SECTOR_NUMBER_LENGTH = 2;/*** 保留 长度*/public static final short RETAIN_LENGTH = 12;/*** BIOS驱动器号 长度*/public static final short BIOS_DRIVE_NUMBER_LENGTH = 1;/*** 未用 长度*/public static final short EXTEND_BOOT_FLAG_LENGTH = 1;/*** 扩展引导标记 长度*/public static final short UNUSED_4_LENGTH = 1;/*** 卷序列号 长度*/public static final short VOLUME_SERIAL_NUMBER_LENGTH = 4;/*** 卷标 长度*/public static final short VOLUME_LABEL_LENGTH = 11;/*** 文件系统类型 长度*/public static final short FILE_SYSTEM_TYPE_LENGTH = 8;/*** 每扇区字节数* 字节偏移 0x0B {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#SECTOR_BYTE_NUM_OFFSET_POSITION }* 长度 2个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#SECTOR_BYTE_NUM_LENGTH }* 记录每个逻辑扇区的大小,其常见的值为512,但是并不是固定的值。* 该值可以由程序定义,合法值包括512、1024、2048、4096。*/private Short sectorByteNum;/*** 每簇扇区数* 字节偏移 0x0D {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#CLUSTER_SECTOR_NUM_OFFSET_POSITION }* 长度 1个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#CLUSTER_SECTOR_NUM_LENGTH }* 记录着文件系统的簇大小,即由多少个扇区组成一个簇。* 簇是FAT12,FAT16及FAT32文件系统下数据的最小存储单元,* 一个簇由一组连续的扇区组成,簇所含的扇区数必须是2的整数次幂,* 如1,2,4,8,16,32,64,128.* 在Windows 2000以前族最大值为64扇区,之后最大值为128。* 在FAT文件系统中,所有的簇是从2开始编号,* 每个簇都有一个自己的地址编号,* 但是所有的簇都位于数据区,在数据区之前没有簇。*/private Byte clusterSectorNum;/*** DBR保留扇区数* 字节偏移 0x0E {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#DBR_RESERVED_SECTOR_NUM_OFFSET_POSITION }* 长度 2个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#DBR_RESERVED_SECTOR_NUM_LENGTH }* DBR到FAT1表之间的扇区数,或者说是FAT1的开始扇区号,对于FAT32文件系统来说,该值的范围是32扇区到38扇区之间。*/private Short dbrReservedSectorNum;/*** FAT个数* 字节偏移 0x10 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#FAT_NUM_OFFSET_POSITION }* 长度 1个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#FAT_NUM_LENGTH }* 一般为2*/private Byte fatNum;/*** 介质描述符* 字节偏移 0x15 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#MEDIA_DESCRIPTOR_OFFSET_POSITION }* 长度 1个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#MEDIA_DESCRIPTOR_LENGTH }* 描述磁盘介质的参数,根据磁盘性质的不同,取不同的值。0xF8标准值,可移动存储介质,常用 0xF0*/private Byte mediaDescriptor;/*** 每磁道扇区数* 字节偏移 0x18 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#TRACK_SECTOR_NUM_OFFSET_POSITION }* 长度 2个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#TRACK_SECTOR_NUM_LENGTH }* 一般其值为63*/private Short trackSectorNum;/*** 磁头数* 字节偏移 0x1A {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#HEAD_NUM_OFFSET_POSITION }* 长度 2个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#HEAD_NUM_LENGTH }* 一般为255*/private Short headNum;/*** 隐藏扇区数* 字节偏移 0x1C {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#HIDDEN_SECTOR_OFFSET_POSITION }* 长度 4个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#HIDDEN_SECTOR_LENGTH }* 是MBR到DBR之间的扇区数,对于扩展分区中逻辑驱动顺来说,是其EBR到DBR。可以为0。*/private Integer hiddenSector;/*** 分区扇区总数* 字节偏移 0x20 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#PARTITION_SECTOR_NUM_OFFSET_POSITION }* 长度 4个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#PARTITION_SECTOR_NUM_LENGTH }* 分区的总扇区数,也就是FAT32分区的大小*/private Integer partitionSectorNum;/** 扩展BPB*//*** 每FAT扇区数* 字节偏移 0x24 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#FAT_SECTOR_NUM_OFFSET_POSITION }* 长度 4个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#FAT_SECTOR_NUM_LENGTH }* FAT表占用扇区数*/private Integer fatSectorNum;/*** 标记* 字节偏移 0x28 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#SIGN_OFFSET_POSITION }* 长度 2个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#SIGN_LENGTH }* FAT32是否可用,2为可用,此域FAT32 特有*/private Short sign;/*** 版本* 字节偏移 0x2A {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#VERSION_OFFSET_POSITION }* 长度 2个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#VERSION_LENGTH }* FAT32版本号0.0,FAT32特有*/private Short version;/*** 根目录首簇号* 字节偏移 0x2C {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#ROOT_CLUSTER_NUMBER_OFFSET_POSITION }* 长度 4个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#ROOT_CLUSTER_NUMBER_LENGTH }* 分区在格式化的时候,* 格式化程序会在数据区中指派一个簇作为FAT32的根目录的开始,并把该簇号记录在BPB中。* 通常都是把数据区中的第一簇分配给根目录使用,也就是2号簇。*/private Integer rootClusterNumber;/*** 文件系统信息扇区号* 字节偏移 0x30 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_OFFSET_POSITION }* 长度 2个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_LENGTH }* FAT32文件系统在DBR的保留扇区中安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个可用的空闲簇的簇号,* 该扇区一般在分区的1号扇区,也就是紧跟在DBR之后的一个扇区。* FSINFO(文件系统信息扇区)扇区号1,该扇区为操作系统提供关于空簇总数及下一可用簇的信息*/private Short fileSystemInformationSectorNumber;/*** DBR备份扇区号* 字节偏移 0x32 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#BACKUP_SECTOR_NUMBER_OFFSET_POSITION }* 长度 2个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#BACKUP_SECTOR_NUMBER_LENGTH }* FAT32文件系统在DBR的保留扇区中安排了一个DBR的备份,* 一般在6号扇区,也就是分区的第7个扇区,该备份扇区与原DBR扇区的内容完全一样,如果原DBR遭到破坏,可以用备份扇区号修复。*/private Short backupSectorNumber;/*** BIOS驱动器号* 字节偏移 0x40 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#BIOS_DRIVE_NUMBER_OFFSET_POSITION }* 长度 1个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#BIOS_DRIVE_NUMBER_LENGTH }* 这是BIOS的INT 13H所描述的设备号码,一般硬盘为80H,一般软盘为00H等*/private Byte biosDriveNumber;/*** 扩展引导标记* 字节偏移 0x41 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#EXTEND_BOOT_FLAG_OFFSET_POSITION }* 长度 1个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#EXTEND_BOOT_FLAG_LENGTH }* 用来确认后面的三个参数是否有效,FAT为29H*/private Byte extendBootFlag;/*** 卷序列号* 字节偏移 0x43 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#VOLUME_SERIAL_NUMBER_OFFSET_POSITION }* 长度 4个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#VOLUME_SERIAL_NUMBER_LENGTH }* 磁盘序列号,通常为一随机数*/private Integer volumeSerialNumber;/*** 卷标* 字节偏移 0x47 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#VOLUME_LABEL_OFFSET_POSITION }* 长度 11个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#VOLUME_LABEL_LENGTH }* 用户设置的卷标ASCII,如果没有则4E 4F 20 4E 41 4D 45 20 20 20 20 即NO NAME。如果建立文件系统的时候指定了卷标,会保存在此*/private Character[] volumeLabel;/*** 文件系统类型* 字节偏移 0x52 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#FILE_SYSTEM_TYPE_OFFSET_POSITION }* 长度 8个字节 {@link cn.edu.zstu.fms.storage.DOSBootRecord.BIOSParameterBlock#FILE_SYSTEM_TYPE_LENGTH }* 使用ASCII码记录当前分区的文件系统类型,46 41 54 33 32 20 20 20即FAT32*/private Character[] fileSystemType;/*** 构造器*/public BIOSParameterBlock(){this.sectorByteNum = ByteUtil.getShort(extract(SECTOR_BYTE_NUM_OFFSET_POSITION,SECTOR_BYTE_NUM_LENGTH));this. clusterSectorNum = ByteUtil.getByte(extract(CLUSTER_SECTOR_NUM_OFFSET_POSITION,CLUSTER_SECTOR_NUM_LENGTH));this.dbrReservedSectorNum = ByteUtil.getShort(extract(DBR_RESERVED_SECTOR_NUM_OFFSET_POSITION,DBR_RESERVED_SECTOR_NUM_LENGTH));this.fatNum = ByteUtil.getByte(extract(FAT_NUM_OFFSET_POSITION,FAT_NUM_LENGTH));this.mediaDescriptor = ByteUtil.getByte(extract(MEDIA_DESCRIPTOR_OFFSET_POSITION,MEDIA_DESCRIPTOR_LENGTH));this.trackSectorNum = ByteUtil.getShort(extract(TRACK_SECTOR_NUM_OFFSET_POSITION,TRACK_SECTOR_NUM_LENGTH));this.headNum = ByteUtil.getShort(extract(HEAD_NUM_OFFSET_POSITION,HEAD_NUM_LENGTH));this.hiddenSector = ByteUtil.getInteger(extract(HIDDEN_SECTOR_OFFSET_POSITION,HIDDEN_SECTOR_LENGTH));this.partitionSectorNum = ByteUtil.getInteger(extract(PARTITION_SECTOR_NUM_OFFSET_POSITION,PARTITION_SECTOR_NUM_LENGTH));/** 扩展BPB*/this.fatSectorNum = ByteUtil.getInteger(extract(FAT_SECTOR_NUM_OFFSET_POSITION,FAT_SECTOR_NUM_LENGTH));this.sign = ByteUtil.getShort(extract(SIGN_OFFSET_POSITION,SIGN_LENGTH));this.version = ByteUtil.getShort(extract(VERSION_OFFSET_POSITION,VERSION_LENGTH));this.rootClusterNumber = ByteUtil.getInteger(extract(ROOT_CLUSTER_NUMBER_OFFSET_POSITION,ROOT_CLUSTER_NUMBER_LENGTH));this.fileSystemInformationSectorNumber = ByteUtil.getShort(extract(FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_OFFSET_POSITION,FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_LENGTH));this.backupSectorNumber = ByteUtil.getShort(extract(BACKUP_SECTOR_NUMBER_OFFSET_POSITION,BACKUP_SECTOR_NUMBER_LENGTH));this.biosDriveNumber = ByteUtil.getByte(extract(BIOS_DRIVE_NUMBER_OFFSET_POSITION,BIOS_DRIVE_NUMBER_LENGTH));this.extendBootFlag = ByteUtil.getByte(extract(EXTEND_BOOT_FLAG_OFFSET_POSITION,EXTEND_BOOT_FLAG_LENGTH));this.volumeSerialNumber = ByteUtil.getInteger(extract(VOLUME_SERIAL_NUMBER_OFFSET_POSITION,VOLUME_SERIAL_NUMBER_LENGTH));this.volumeLabel = ByteUtil.getCharacters(extract(VOLUME_LABEL_OFFSET_POSITION,VOLUME_LABEL_LENGTH));this.fileSystemType=ByteUtil.getCharacters(extract(FILE_SYSTEM_TYPE_OFFSET_POSITION,FILE_SYSTEM_TYPE_LENGTH));}}public Short getSectorByteNum() {return this.biosParameterBlock.sectorByteNum;}public void setSectorByteNum(Short sectorByteNum) {this.biosParameterBlock.sectorByteNum = sectorByteNum;save(ByteUtil.getBytes(this.biosParameterBlock.sectorByteNum),BIOSParameterBlock.SECTOR_BYTE_NUM_OFFSET_POSITION,BIOSParameterBlock.SECTOR_BYTE_NUM_LENGTH);}public Byte getClusterSectorNum() {return this.biosParameterBlock.clusterSectorNum;}public void setClusterSectorNum(Byte clusterSectorNum) {this.biosParameterBlock.clusterSectorNum = clusterSectorNum;save(ByteUtil.getBytes(this.biosParameterBlock.clusterSectorNum),BIOSParameterBlock.CLUSTER_SECTOR_NUM_OFFSET_POSITION,BIOSParameterBlock.CLUSTER_SECTOR_NUM_LENGTH);}public Short getDBRReservedSectorNum() {return this.biosParameterBlock.dbrReservedSectorNum;}public void setDBRReservedSectorNum(Short dbrReservedSectorNum) {this.biosParameterBlock.dbrReservedSectorNum = dbrReservedSectorNum;save(ByteUtil.getBytes(this.biosParameterBlock.dbrReservedSectorNum),BIOSParameterBlock.DBR_RESERVED_SECTOR_NUM_OFFSET_POSITION,BIOSParameterBlock.DBR_RESERVED_SECTOR_NUM_LENGTH);}public Byte getFATNum() {return this.biosParameterBlock.fatNum;}public void setFATNum(Byte FATNum) {this.biosParameterBlock.fatNum = FATNum;save(ByteUtil.getBytes(this.biosParameterBlock.fatNum),BIOSParameterBlock.FAT_NUM_OFFSET_POSITION,BIOSParameterBlock.FAT_NUM_LENGTH);}public Byte getMediaDescriptor() {return this.biosParameterBlock.mediaDescriptor;}public void setMediaDescriptor(Byte mediaDescriptor) {this.biosParameterBlock.mediaDescriptor = mediaDescriptor;save(ByteUtil.getBytes(this.biosParameterBlock.mediaDescriptor),BIOSParameterBlock.MEDIA_DESCRIPTOR_OFFSET_POSITION,BIOSParameterBlock.MEDIA_DESCRIPTOR_LENGTH);}public Short getTrackSectorNum() {return this.biosParameterBlock.trackSectorNum;}public void setTrackSectorNum(Short trackSectorNum) {this.biosParameterBlock.trackSectorNum = trackSectorNum;save(ByteUtil.getBytes(this.biosParameterBlock.trackSectorNum),BIOSParameterBlock.TRACK_SECTOR_NUM_OFFSET_POSITION,BIOSParameterBlock.TRACK_SECTOR_NUM_LENGTH);}public Short getHeadNum() {return this.biosParameterBlock.headNum;}public void setHeadNum(Short headNum) {this.biosParameterBlock.headNum = headNum;save(ByteUtil.getBytes(this.biosParameterBlock.headNum),BIOSParameterBlock.HEAD_NUM_OFFSET_POSITION,BIOSParameterBlock. HEAD_NUM_LENGTH);}public Integer getHiddenSector() {return this.biosParameterBlock.hiddenSector;}public void setHiddenSector(Integer hiddenSector) {this.biosParameterBlock.hiddenSector = hiddenSector;save(ByteUtil.getBytes(this.biosParameterBlock.hiddenSector),BIOSParameterBlock.HIDDEN_SECTOR_OFFSET_POSITION,BIOSParameterBlock.HIDDEN_SECTOR_LENGTH);}public Integer getPartitionSectorNum() {return this.biosParameterBlock.partitionSectorNum;}public void setPartitionSectorNum(Integer partitionSectorNum) {this.biosParameterBlock.partitionSectorNum = partitionSectorNum;save(ByteUtil.getBytes(this.biosParameterBlock.partitionSectorNum),BIOSParameterBlock.PARTITION_SECTOR_NUM_OFFSET_POSITION,BIOSParameterBlock.PARTITION_SECTOR_NUM_LENGTH);}/** 扩展BPB*/public Integer getFATSectorNum() {return this.biosParameterBlock.fatSectorNum;}public void setFATSectorNum(Integer FATSectorNum) {this.biosParameterBlock.fatSectorNum = FATSectorNum;save(ByteUtil.getBytes(this.biosParameterBlock.fatSectorNum),BIOSParameterBlock.FAT_SECTOR_NUM_OFFSET_POSITION,BIOSParameterBlock.FAT_SECTOR_NUM_LENGTH);}public Short getSign() {return this.biosParameterBlock.sign;}public void setSign(Short sign) {this.biosParameterBlock.sign = sign;save(ByteUtil.getBytes(this.biosParameterBlock.sign),BIOSParameterBlock.SIGN_OFFSET_POSITION,BIOSParameterBlock.SIGN_LENGTH);}public Short getVersion() {return this.biosParameterBlock.version;}public void setVersion(Short version) {this.biosParameterBlock.version = version;save(ByteUtil.getBytes(this.biosParameterBlock.version),BIOSParameterBlock.VERSION_OFFSET_POSITION,BIOSParameterBlock.VERSION_LENGTH);}public Integer getRootClusterNumber() {return this.biosParameterBlock.rootClusterNumber;}public void setRootClusterNumber(Integer rootClusterNumber) {this.biosParameterBlock.rootClusterNumber = rootClusterNumber;save(ByteUtil.getBytes(this.biosParameterBlock.rootClusterNumber),BIOSParameterBlock.ROOT_CLUSTER_NUMBER_OFFSET_POSITION,BIOSParameterBlock.ROOT_CLUSTER_NUMBER_LENGTH);}public Short getFileSystemInformationSectorNumber() {return this.biosParameterBlock.fileSystemInformationSectorNumber;}public void setFileSystemInformationSectorNumber(Short fileSystemInformationSectorNumber) {this.biosParameterBlock.fileSystemInformationSectorNumber = fileSystemInformationSectorNumber;save(ByteUtil.getBytes(this.biosParameterBlock.fileSystemInformationSectorNumber),BIOSParameterBlock.FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_OFFSET_POSITION,BIOSParameterBlock.FILE_SYSTEM_INFORMATION_SECTOR_NUMBER_LENGTH);}public Short getBackupSectorNumber() {return this.biosParameterBlock.backupSectorNumber;}public void setBackupSectorNumber(Short backupSectorNumber) {this.biosParameterBlock.backupSectorNumber = backupSectorNumber;save(ByteUtil.getBytes(this.biosParameterBlock.backupSectorNumber),BIOSParameterBlock.BACKUP_SECTOR_NUMBER_OFFSET_POSITION,BIOSParameterBlock.BACKUP_SECTOR_NUMBER_LENGTH);}public Byte getBiosDriveNumber() {return this.biosParameterBlock.biosDriveNumber;}public void setBiosDriveNumber(Byte biosDriveNumber) {this.biosParameterBlock.biosDriveNumber = biosDriveNumber;save(ByteUtil.getBytes(this.biosParameterBlock.biosDriveNumber),BIOSParameterBlock.BIOS_DRIVE_NUMBER_OFFSET_POSITION,BIOSParameterBlock.BIOS_DRIVE_NUMBER_LENGTH);}public Byte getExtendBootFlag() {return this.biosParameterBlock.extendBootFlag;}public void setExtendBootFlag(Byte extendBootFlag) {this.biosParameterBlock.extendBootFlag = extendBootFlag;save(ByteUtil.getBytes(this.biosParameterBlock.extendBootFlag),BIOSParameterBlock.EXTEND_BOOT_FLAG_OFFSET_POSITION,BIOSParameterBlock.EXTEND_BOOT_FLAG_LENGTH);}public Integer getVolumeSerialNumber() {return this.biosParameterBlock.volumeSerialNumber;}public void setVolumeSerialNumber(Integer volumeSerialNumber) {this.biosParameterBlock.volumeSerialNumber = volumeSerialNumber;save(ByteUtil.getBytes(this.biosParameterBlock.volumeSerialNumber),BIOSParameterBlock.VOLUME_SERIAL_NUMBER_OFFSET_POSITION,BIOSParameterBlock.VOLUME_SERIAL_NUMBER_LENGTH);}public Character[] getVolumeLabel() {return this.biosParameterBlock.volumeLabel;}public void setVolumeLabel(Character[] volumeLabel) {this.biosParameterBlock.volumeLabel = volumeLabel;save(ByteUtil.getBytes(this.biosParameterBlock.volumeLabel),BIOSParameterBlock.VOLUME_LABEL_OFFSET_POSITION,BIOSParameterBlock.VOLUME_LABEL_LENGTH);}public Character[] getFileSystemType() {return this.biosParameterBlock.fileSystemType;}public void setFileSystemType(Character[] fileSystemType) {this.biosParameterBlock.fileSystemType = fileSystemType;save(ByteUtil.getBytes(this.biosParameterBlock.fileSystemType),BIOSParameterBlock.FILE_SYSTEM_TYPE_OFFSET_POSITION,BIOSParameterBlock.FILE_SYSTEM_TYPE_LENGTH);}private byte[] extract(short start, short length) {byte[] dest = new byte[length];System.arraycopy(source, start, dest, 0, length);return dest;}private void save(byte[] src ,short start, short length) {System.arraycopy(src, 0, this.source, start, length);}
}
class ByteUtil {public static byte[] getBytes(byte data){byte[] bytes = new byte[1];bytes[0] = data;return bytes;}public static byte[] getBytes(short data) {byte[] bytes = new byte[2];bytes[0] = (byte) (data & 0xff);bytes[1] = (byte) ((data & 0xff00) >> 8);return bytes;}public static byte[] getBytes(char data) {byte[] bytes = new byte[2];bytes[0] = (byte) (data);bytes[1] = (byte) (data >> 8);return bytes;}public static byte[] getBytes(int data) {byte[] bytes = new byte[4];bytes[0] = (byte) (data & 0xff);bytes[1] = (byte) ((data & 0xff00) >> 8);bytes[2] = (byte) ((data & 0xff0000) >> 16);bytes[3] = (byte) ((data & 0xff000000) >> 24);return bytes;}public static byte[] getBytes(long data) {byte[] bytes = new byte[8];bytes[0] = (byte) (data & 0xff);bytes[1] = (byte) ((data >> 8) & 0xff);bytes[2] = (byte) ((data >> 16) & 0xff);bytes[3] = (byte) ((data >> 24) & 0xff);bytes[4] = (byte) ((data >> 32) & 0xff);bytes[5] = (byte) ((data >> 40) & 0xff);bytes[6] = (byte) ((data >> 48) & 0xff);bytes[7] = (byte) ((data >> 56) & 0xff);return bytes;}public static byte[] getBytes(float data) {int intBits = Float.floatToIntBits(data);return getBytes(intBits);}public static byte[] getBytes(double data) {long intBits = Double.doubleToLongBits(data);return getBytes(intBits);}public static byte[] getBytes(String data, String charsetName) {Charset charset = Charset.forName(charsetName);return data.getBytes(charset);}public static byte[] getBytes(String data) {return getBytes(data, "UTF-8");}public static byte[] getBytes(Character[] data){byte[] bytes = new byte[data.length];for (int i=0; i<data.length; i++){bytes[i] = (byte) (char) data[i];}return bytes;}public static Byte getByte(byte[] bytes) {return bytes[0];}public static short getShort(byte[] bytes) {return (short) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8)));}public static char getCharacter(byte b) {return (char) b;}public static char getCharacter(byte[] bytes) {return (char) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8)));}public static int getInteger(byte[] bytes) {return (0xff & bytes[0])| (0xff00 & (bytes[1] << 8))| (0xff0000 & (bytes[2] << 16))| (0xff000000 & (bytes[3] << 24));}public static long getLong(byte[] bytes) {return(0xffL & (long)bytes[0])| (0xff00L & ((long)bytes[1] << 8))| (0xff0000L & ((long)bytes[2] << 16))| (0xff000000L & ((long)bytes[3] << 24))| (0xff00000000L & ((long)bytes[4] << 32))| (0xff0000000000L & ((long)bytes[5] << 40))| (0xff000000000000L & ((long)bytes[6] << 48))| (0xff00000000000000L & ((long)bytes[7] << 56));}public static float getFloat(byte[] bytes) {return Float.intBitsToFloat(getInteger(bytes));}public static double getDouble(byte[] bytes) {long l = getLong(bytes);System.out.println(l);return Double.longBitsToDouble(l);}public static String getString(byte[] bytes, String charsetName) {return new String(bytes, Charset.forName(charsetName));}public static String getString(byte[] bytes) {return getString(bytes, "UTF-8");}public static Character[] getCharacters(byte[] bytes) {Character[] characters = new Character[bytes.length];for (int i=0; i<bytes.length; i++){characters[i] = getCharacter(bytes[i]);}return characters;}
}
参考文章
FAT32
FAT32文件系统详解
javadoc中{@link}与@see的简单使用以及区别
FAT32文件系统快速入门
FAT32文件系统结构详解
JAVA——构建FAT32文件系统的DBR(DOS引导记录)类相关推荐
- DSP之解读FAT32文件系统
FAT 的全称是File Allocation Table(文件分配表系统),FAT 文件系统1982年开始应用于MS- DOS 中. FAT 文件系统主要的优点是它可以被多种操作系统访问,如MS- ...
- Fat32文件系统详解--DBR与目录
Fat32文件系统总览 DBR:DBR的全称为DOS Boot Record,含义是DOS引导记录,记录了引导程序和 BPB,BPB中记录了该文件系统的重要信息,在DBR之后往往有一些保留扇区. ...
- 【转载】FAT32文件系统详解
硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上.任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式.例如:常见的文件系统有FAT,NTFS,EXT ...
- FAT32文件系统学习
FAT32文件系统组成及介绍 FAT32文件系统结构图: 下图演示了FAT32文件系统的DBR: 1.DBR及其保留扇区:含义是DOS引导记录,也称为操作系统引导记录,在DBR之后往往有一些保留扇区 ...
- 详解FAT32文件系统
硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上.任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式.例如:常见的文件系统有FAT,NTFS, ...
- fat32文件系统的实现与buddy算法
报告一 FAT32文件系统的实现 文件系统(File System)是计算机系统必不可少的组成部分,可以说除了部分结构简单的单片机系统之外,文件系统是支撑每一个计算机系统运行的最重要的支撑,无论 ...
- fat16和fat32文件系统学习
根据自己电脑的fat,fat32分区来学习fat,fat32文件系统 fat16和fat32文件系统学习 - 下载频道 - CSDN.NET http://download.csdn.net/deta ...
- SD卡FAT32文件系统格式
一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...
- FAT32文件系统--For TF卡
http://blog.csdn.net/myarrow/article/details/8725073 1. TF卡空间是如何分配的? 下面以4GB TF卡为例,通过WinHex工具进行分析,其空间 ...
最新文章
- 统计多段线长度命令_Auto CAD机械绘图入门教程11(编辑命令:延伸)
- λ-矩阵(若尔当标准形的理论推论)
- 索引 - 数据结构 - B+TREE
- centos 使vim支持+python和+python3
- 卷积神经网络的整体结构、卷积层、池化、python实现
- php 小程序自定义图,微信小程序之如何使用自定义组件封装原生 image 组件
- php技术计算字符个数的函数是什么,php计算字符串中的单词数的函数str_word_count()...
- 读书笔记_中国期货市场量化交易(李尉)04
- Windows 7的上帝模式
- windows 下pcl的安装和编译
- 关于属性值书写无效问题
- 首发速看:智微JMS901双接口U盘成功量产,附量产工具软件+固件+教程分享
- 交互电子白板有哪些特点?电子白板功能介绍
- 软件编程c语言5级,全国青少年软件编程等级考试标准(c语言1级-10级)-20190927.pdf...
- Androidstudio集成Butterknife后get和set方法不能用了处理办法(java.lang.IllegalArgumentException: cannot add an acti)
- matlab排版形式是什么样子,版式设计技巧!论图文排版的基本形式
- 每天3个面试题精研 - 前端 - 第4-6天
- 智力过河游戏c语言,Flash AS代码实现智力过河小游戏
- AD学习笔记(四)PCB布局分析
- U盘无法打开提示格式化解决方案
热门文章
- 使用windbg排查一个内存溢出的问题
- 如何在基于 Silverlight 的本地应用程序之间实现通信
- 通过编程为ASP.NET页面设置缓存
- 摘要注释_论文摘要怎么写,小编来帮你
- java hibernate sqlserver自增_怎样在hibernate中实现oracle的主键自增策略?
- java服务器测试_正确的方法来测试服务器是否在Java中运行?
- java list 数据不重复,Java中List集合去除重复数据的方法
- mysql创建库和表确保utf8_mysql创建utf8数据库
- 计算机设计学校,计算机设计制作大赛
- ​亚马逊出品:非均匀扰动的对抗鲁棒性理论分析