📄 fileblockdevice.java
字号:
header[pos++] = (byte) 0x00;//this and following 3 bytes are irrelevant for FAT32 (N/A) header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0xF8;//do not change header[pos++] = (byte) 0x00;//N/A header[pos++] = (byte) 0x00;//N/A System.arraycopy(toByteArray(sectorsPerTrack,1),0,header,pos++,1); header[pos++] = (byte) 0x00;// byte offset 0x19 System.arraycopy(toByteArray(heads,1),0,header,pos++,1); header[pos++] = (byte) 0x00;// byte offset 0x1B System.arraycopy(toByteArray(hiddenSectors,4),0,header,pos++,4);//number of hidden sectors (63 on non partitioned media) byte offset 0x1C pos=pos+3; //byte offset 0x20 = total number of sectors in partition System.arraycopy(toByteArray(totalSectors,4),0,header,pos++,4); pos=pos+3; //byte offset 0x24 -- number of sectors per FAT = 520 for 520MB drive (4 bytes) System.arraycopy(toByteArray(sectorsPerFAT,4),0,header,pos++,4); pos=pos+3; header[pos++] = (byte) 0x00;//byte offset 0x28 -- *****this could be wrong, tells which FAT is active (http://home.teleport.com/~brainy/fat32.htm) header[pos++] = (byte) 0x00;//byte offset 0x29 header[pos++] = (byte) 0x00;//byte offset 0x2A -- this and the next seem irrelevant (FAT32 version) (possibly set to 0) header[pos++] = (byte) 0x00;//byte offset 0x2B //byte offset 0x2C -- cluster number of the start of the root directory (4 bytes) System.arraycopy(toByteArray(rootStartCluster,4),0,header,pos++,4); pos=pos+3; //byte offset 0x30 -- sector number of FSINFO sector (is this 1 or two bytes??? although it doesn't matter) System.arraycopy(toByteArray(fsinfoSector,1),0,header,pos++,1); header[pos++] = (byte) 0x00;//byte offset 0x31 //byte offset 0x32 -- sector number of backup boot sector System.arraycopy(toByteArray(backupBootSector,1),0,header,pos++,1); header[pos++] = (byte) 0x00;//byte offset 0x33 header[pos++] = (byte) 0x00;//byte offset 0x34 -- 12 bytes of N/A header[pos++] = (byte) 0x00;//byte offset 0x35 header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x80;//byte offset 0x40 header[pos++] = (byte) 0x00; header[pos++] = (byte) 0x29;//do not change (extended signature) header[pos++] = (byte) 0x26;//these four are the serial number of the partition header[pos++] = (byte) 0x59; header[pos++] = (byte) 0x41; header[pos++] = (byte) 0x31; header[pos++] = (byte) 0x49; header[pos++] = (byte) 0x41; header[pos++] = (byte) 0x4E; header[pos++] = (byte) 0x52; header[pos++] = (byte) 0x4F; header[pos++] = (byte) 0x43; header[pos++] = (byte) 0x4B; header[pos++] = (byte) 0x53; header[pos++] = (byte) 0x46; header[pos++] = (byte) 0x33; header[pos++] = (byte) 0x32; header[pos++] = (byte) 0x46;//byte offset 0x52 F header[pos++] = (byte) 0x41;//byte offset 0x37 A header[pos++] = (byte) 0x54;//byte offset 0x38 T header[pos++] = (byte) 0x33;//byte offset 0x39 3 header[pos++] = (byte) 0x32;//byte offset 0x3A 2 header[pos++] = (byte) 0x20;//byte offset 0x3B header[pos++] = (byte) 0x20;//byte offset 0x3C header[pos++] = (byte) 0x20;//byte offset 0x3D //Need to copy in the bootstrap code (420 bytes) byte[] bootstrap = { (byte)0x33, (byte)0xC9, (byte)0x8E, (byte)0xD1, (byte)0xBC, (byte)0xF4, (byte)0x7B, (byte)0x8E, (byte)0xC1, (byte)0x8E, (byte)0xD9, (byte)0xBD, (byte)0x00, (byte)0x7C, (byte)0x88, (byte)0x4E, (byte)0x02, (byte)0x8A, (byte)0x56, (byte)0x40, (byte)0xB4, (byte)0x08, (byte)0xCD, (byte)0x13, (byte)0x73, (byte)0x05, (byte)0xB9, (byte)0xFF, (byte)0xFF, (byte)0x8A, (byte)0xF1, (byte)0x66, (byte)0x0F, (byte)0xB6, (byte)0xC6, (byte)0x40, (byte)0x66, (byte)0x0F, (byte)0xB6, (byte)0xD1, (byte)0x80, (byte)0xE2, (byte)0x3F, (byte)0xF7, (byte)0xE2, (byte)0x86, (byte)0xCD, (byte)0xC0, (byte)0xED, (byte)0x06, (byte)0x41, (byte)0x66, (byte)0x0F, (byte)0xB7, (byte)0xC9, (byte)0x66, (byte)0xF7, (byte)0xE1, (byte)0x66, (byte)0x89, (byte)0x46, (byte)0xF8, (byte)0x83, (byte)0x7E, (byte)0x16, (byte)0x00, (byte)0x75, (byte)0x38, (byte)0x83, (byte)0x7E, (byte)0x2A, (byte)0x00, (byte)0x77, (byte)0x32, (byte)0x66, (byte)0x8B, (byte)0x46, (byte)0x1C, (byte)0x66, (byte)0x83, (byte)0xC0, (byte)0x0C, (byte)0xBB, (byte)0x00, (byte)0x80, (byte)0xB9, (byte)0x01, (byte)0x00, (byte)0xE8, (byte)0x2B, (byte)0x00, (byte)0xE9, (byte)0x48, (byte)0x03, (byte)0xA0, (byte)0xFA, (byte)0x7D, (byte)0xB4, (byte)0x7D, (byte)0x8B, (byte)0xF0, (byte)0xAC, (byte)0x84, (byte)0xC0, (byte)0x74, (byte)0x17, (byte)0x3C, (byte)0xFF, (byte)0x74, (byte)0x09, (byte)0xB4, (byte)0x0E, (byte)0xBB, (byte)0x07, (byte)0x00, (byte)0xCD, (byte)0x10, (byte)0xEB, (byte)0xEE, (byte)0xA0, (byte)0xFB, (byte)0x7D, (byte)0xEB, (byte)0xE5, (byte)0xA0, (byte)0xF9, (byte)0x7D, (byte)0xEB, (byte)0xE0, (byte)0x98, (byte)0xCD, (byte)0x16, (byte)0xCD, (byte)0x19, (byte)0x66, (byte)0x60, (byte)0x66, (byte)0x3B, (byte)0x46, (byte)0xF8, (byte)0x0F, (byte)0x82, (byte)0x4A, (byte)0x00, (byte)0x66, (byte)0x6A, (byte)0x00, (byte)0x66, (byte)0x50, (byte)0x06, (byte)0x53, (byte)0x66, (byte)0x68, (byte)0x10, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x80, (byte)0x7E, (byte)0x02, (byte)0x00, (byte)0x0F, (byte)0x85, (byte)0x20, (byte)0x00, (byte)0xB4, (byte)0x41, (byte)0xBB, (byte)0xAA, (byte)0x55, (byte)0x8A, (byte)0x56, (byte)0x40, (byte)0xCD, (byte)0x13, (byte)0x0F, (byte)0x82, (byte)0x1C, (byte)0x00, (byte)0x81, (byte)0xFB, (byte)0x55, (byte)0xAA, (byte)0x0F, (byte)0x85, (byte)0x14, (byte)0x00, (byte)0xF6, (byte)0xC1, (byte)0x01, (byte)0x0F, (byte)0x84, (byte)0x0D, (byte)0x00, (byte)0xFE, (byte)0x46, (byte)0x02, (byte)0xB4, (byte)0x42, (byte)0x8A, (byte)0x56, (byte)0x40, (byte)0x8B, (byte)0xF4, (byte)0xCD, (byte)0x13, (byte)0xB0, (byte)0xF9, (byte)0x66, (byte)0x58, (byte)0x66, (byte)0x58, (byte)0x66, (byte)0x58, (byte)0x66, (byte)0x58, (byte)0xEB, (byte)0x2A, (byte)0x66, (byte)0x33, (byte)0xD2, (byte)0x66, (byte)0x0F, (byte)0xB7, (byte)0x4E, (byte)0x18, (byte)0x66, (byte)0xF7, (byte)0xF1, (byte)0xFE, (byte)0xC2, (byte)0x8A, (byte)0xCA, (byte)0x66, (byte)0x8B, (byte)0xD0, (byte)0x66, (byte)0xC1, (byte)0xEA, (byte)0x10, (byte)0xF7, (byte)0x76, (byte)0x1A, (byte)0x86, (byte)0xD6, (byte)0x8A, (byte)0x56, (byte)0x40, (byte)0x8A, (byte)0xE8, (byte)0xC0, (byte)0xE4, (byte)0x06, (byte)0x0A, (byte)0xCC, (byte)0xB8, (byte)0x01, (byte)0x02, (byte)0xCD, (byte)0x13, (byte)0x66, (byte)0x61, (byte)0x0F, (byte)0x82, (byte)0x54, (byte)0xFF, (byte)0x81, (byte)0xC3, (byte)0x00, (byte)0x02, (byte)0x66, (byte)0x40, (byte)0x49, (byte)0x0F, (byte)0x85, (byte)0x71, (byte)0xFF, (byte)0xC3, (byte)0x4E, (byte)0x54, (byte)0x4C, (byte)0x44, (byte)0x52, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x20, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x0D, (byte)0x0A, (byte)0x52, (byte)0x65, (byte)0x6D, (byte)0x6F, (byte)0x76, (byte)0x65, (byte)0x20, (byte)0x64, (byte)0x69, (byte)0x73, (byte)0x6B, (byte)0x73, (byte)0x20, (byte)0x6F, (byte)0x72, (byte)0x20, (byte)0x6F, (byte)0x74, (byte)0x68, (byte)0x65, (byte)0x72, (byte)0x20, (byte)0x6D, (byte)0x65, (byte)0x64, (byte)0x69, (byte)0x61, (byte)0x2E, (byte)0xFF, (byte)0x0D, (byte)0x0A, (byte)0x44, (byte)0x69, (byte)0x73, (byte)0x6B, (byte)0x20, (byte)0x65, (byte)0x72, (byte)0x72, (byte)0x6F, (byte)0x72, (byte)0xFF, (byte)0x0D, (byte)0x0A, (byte)0x50, (byte)0x72, (byte)0x65, (byte)0x73, (byte)0x73, (byte)0x20, (byte)0x61, (byte)0x6E, (byte)0x79, (byte)0x20, (byte)0x6B, (byte)0x65, (byte)0x79, (byte)0x20, (byte)0x74, (byte)0x6F, (byte)0x20, (byte)0x72, (byte)0x65, (byte)0x73, (byte)0x74, (byte)0x61, (byte)0x72, (byte)0x74, (byte)0x0D, (byte)0x0A, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xAC, (byte)0xCB, (byte)0xD8, (byte)0x00, (byte)0x00 }; for(int i=0;i<bootstrap.length;i++) header[pos++] = bootstrap[i]; header[0x1FE] = (byte) 0x55; header[0x1FE + 1] = (byte) 0xAA; //Now do the second sector, the FSINFO sector header2 = new byte[512]; pos=0; header2[pos++] = (byte) 0x52; header2[pos++] = (byte) 0x52; header2[pos++] = (byte) 0x61; header2[pos++] = (byte) 0x41; for(int i=0;i<480;i++) header2[pos++] = (byte) 0x00; header2[pos++] = (byte) 0x72; header2[pos++] = (byte) 0x72; header2[pos++] = (byte) 0x41; header2[pos++] = (byte) 0x61; //number of free clusters (4 bytes) set to FFFFFFFF if unknown header2[pos++] = (byte) 0xFF; header2[pos++] = (byte) 0xFF; header2[pos++] = (byte) 0xFF; header2[pos++] = (byte) 0xFF; //cluster number of most recently allocated cluster (4 bytes) System.arraycopy(toByteArray(lastAllocatedCluster,4),0,header,pos++,4); pos=pos+3; for(int i=0;i<14;i++) header2[pos++] = (byte) 0x00; header2[0x1FE] = (byte) 0x55; header2[0x1FE + 1] = (byte) 0xAA; //************************************************************************************** //FAT1 at sector 32 // set up first 8 bytes of FAT byte[] initialbuffer = {(byte) 0xF8,(byte) 0xFF,(byte) 0xFF,(byte) 0x0F,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 0x0F}; byte[] endmark = {(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF}; System.arraycopy(initialbuffer, 0,FAT,0, 8); rootSizeClusters = (int) (rootSize-1)/sectorsPerCluster + 1; // put in root directory for(int i = 0;i < rootSizeClusters-1 ;i++) System.arraycopy(toByteArray((long) 3+i,(int) 4),0,FAT,4*(i+2),4); // put in end of root directory System.arraycopy(endmark,0,FAT, rootSizeClusters + 1 , 4); // put in file fileSizeClusters = (int) (fileSizeSectors-1)/sectorsPerCluster+1; for(int i = rootSizeClusters + 2 ; i < rootSizeClusters + 1 + fileSizeClusters ; i++) System.arraycopy(toByteArray((long) 1+i ,(int) 4), 0, FAT, 4*i, 4); //put in end of file System.arraycopy(endmark,0,FAT, rootSizeClusters + 1 + fileSizeClusters , 4); //************************************************************************************** //make root directory rootdir=new byte[rootSizeClusters * sectorsPerCluster * bytesPerSector]; for (int i=0; i<rootdir.length;i++){ rootdir[i]=(byte) 0x00; } //first file entry - points to nothing. this is the volume label String volumelabel = "IANROCKSF32"; System.arraycopy(volumelabel.getBytes(),0,rootdir,0,11); rootdir[11]=(byte) 0x08; //first real file entry int startByte = 32; String filename = source.getName(); pattern = Pattern.compile("(\\w*).(\\w*)"); matcher = pattern.matcher(filename); matcher.find(); String name = matcher.group(1); String ext = matcher.group(2);// System.out.println(name +"." + ext + ". length is " + name.length()); //put filename into file entry System.arraycopy(name.getBytes(),0,rootdir,startByte,name.length()); // \w{0,8}.\w{1,3} //put in blank space after filename if it is less than 8 characters for (int i =name.length(); i< 8;i++){ rootdir[startByte+i]=(byte) 0x20; } System.arraycopy(ext.getBytes(),0,rootdir,startByte + 8,ext.length()); rootdir[startByte+11]=(byte) 0x20; //Attrib Byte //put in starting cluster (high 2 bytes) System.arraycopy(toByteArray((rootSizeClusters+2)>>>16,2),0,rootdir,startByte + 20,2); //put in starting cluster (low 2 bytes) System.arraycopy(toByteArray((rootSizeClusters+2) & 0xFFFF,2),0,rootdir,startByte + 26,2); //put in file size in bytes System.arraycopy(toByteArray(raf.length(),4),0,rootdir,startByte + 28,4); //************************************************************************************* //Pad out the first 32 sectors and include copy of bootsector and FSINFO sector empty = new byte[512]; for(int i=0;i<512;i++){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -