Ví dụ: ghi vào entry 2 giá trị F2Ah và entry 3 giá trị BC5h. Do byte 0,1,2 lưu số hiệu đĩa, nên entry 2 sẽđược ghi vào byte thứ 3,4 và entry 3 sẽđược ghi vào byte thứ 4,5 . Cách ghi như sau:
Byte 0 1 2 3 4 5
Giá trị (số hiệu đĩa ) 2A 5F BC unsigned char fat[512*9]; //mảng chứa bảng fat đọc từđĩa
void WriteFat (unsigned new_fat, unsigned k) // ghi giá trị new_fat vào entry thứ k = 2,3,...,3071 {
unsigned i=k*3/2; //entry k sẽđược ghi vào byte thứ i và i+1 if (k%2==0)// k chẵn
{ //đặt 8 bít cuối của new_fat vào byte thứ i fat[i] = new_fat&0x0FF;
//đặt 4 bít cao của new_fat vào 4 bít cuối của byte thứ i+1 fat[i+1] = (fat[i+1]&0xF0) | (new_fat>>8);
} else //k lẻ
{ //đặt 8 bít cao vào vào byte thứ i+1 fat[i+1]=new_fat>>4;
//đặt 4 bít thấp vào 4 bít cao của byte thứ i
fat[i]=((new_fat&0xF)<<4)|(fat[i]&0x0F); }
}
Số sector 1 9 9 14 Cịn lại
Lưu trữ Boot sector FAT12 FAT12 DIR DATA
Byte 0,1,2 3,4,5 … 4606,4607
Lưu trữ e0,e1 (số hiệu đĩa) e2,e3 … e3070, e3071
Bảng FAT12 = 9 sector = 4608 bytes = 3072 entry (mỗi entry 12 bit)
Byte 0-7 8-10 11 12-21 22-23 24-25 26-27 28-31 Lưu trữ Tên File Phần mở rộng ADVSHR Dành riêng Giờ Ngày Số hiệu khối đầu Kích thước File Bảng DIR= 14 sector = 7168 byte = 224 entry (mỗi entry 32 byte), 1 sector=16 entry
Ví dụ: giả sử new_fat = 1AB, luu vao entry k=7 ->luu vao byte i=10 và i+1=11
9 10 11
AB CD EF (trước khi ghi) AB BD 1A (sau khi ghi)
unsigned ReadFat (unsigned k) // Đọc giá trị của entry thứ k (k>=2) {
unsigned i=k*3/2; //entry thứ k ở byte thứ i, i+1
unsigned val_fat=(fat[i+1]<<8) | fat[i] ; // hoặc val_fat=fat[i+1]*256+fat[i]; if (val_fat%2==0) val_fat=val_fat & 0x0FFF;
else val_fat=val_fat>>4; return val_fat; }