JAVA——构建FAT32文件系统的DBR(DOS引导记录)类
生活随笔
收集整理的這篇文章主要介紹了
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引导记录)类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库——关系数据库——交通违规处罚通知
- 下一篇: java信息管理系统总结_java实现科