如何在C语言中向char数组写入12位?求FAT12表项设置函数
实现FAT12 FAT表写入函数的思路与代码
我完全理解你的困扰——FAT12的12位条目存储确实有点绕,毕竟两个条目挤在3个字节里,读写都得小心处理字节重叠的部分。先结合你已有的读取函数,咱们一步步拆解写入逻辑:
首先明确FAT12的存储规则(和你的读取逻辑完全对应):
- 偶数索引的条目:占据
FatOffset字节的全部8位 +FatOffset+1字节的低4位 - 奇数索引的条目:占据
FatOffset字节的高4位 +FatOffset+1字节的全部8位 - 其中
FatOffset = (FATindex * 3) / 2,和你读取函数里的计算一致
写入函数实现
先上代码,再逐行解释:
// FAT是unsigned char数组,value需要是12位有效值(建议先做value &= 0x0fff处理) void SetFatEntry(int FATindex, unsigned int value, unsigned char *FAT) { // 确保写入的值是12位,避免溢出破坏相邻条目数据 value &= 0x0FFF; int FatOffset = ((FATindex * 3) / 2); if (FATindex % 2 == 1) { // 处理奇数索引:条目占当前字节高4位 + 下一字节全8位 // 先保留当前字节的低4位(属于前一个偶数索引的条目,不能覆盖) unsigned char curr_byte = FAT[FatOffset] & 0x0F; // 把当前条目的高4位写入当前字节的高4位,合并后写回 curr_byte |= ((value >> 8) & 0x0F) << 4; FAT[FatOffset] = curr_byte; // 把当前条目的低8位直接写入下一字节 FAT[FatOffset + 1] = value & 0xFF; } else { // 处理偶数索引:条目占当前字节全8位 + 下一字节低4位 // 把当前条目的低8位直接写入当前字节 FAT[FatOffset] = value & 0xFF; // 保留下一字节的高4位(属于后一个奇数索引的条目) unsigned char next_byte = FAT[FatOffset + 1] & 0xF0; // 把当前条目的高4位写入下一字节的低4位,合并后写回 next_byte |= (value >> 8) & 0x0F; FAT[FatOffset + 1] = next_byte; } }
关键逻辑解释
- 值的范围限制:先做
value &= 0x0FFF,确保写入的是12位有效值,防止高位数据意外破坏相邻条目。 - 奇数索引处理:
- 不能直接覆盖
FatOffset字节,因为它的低4位属于前一个偶数索引的条目,必须先保留这部分。 - 条目的高4位(
value >>8 &0x0F)要左移4位,放到FatOffset字节的高4位,再和保留的低4位合并写入。 - 条目的低8位直接写入
FatOffset+1字节即可,这部分不会影响其他条目。
- 不能直接覆盖
- 偶数索引处理:
- 条目的低8位直接写入
FatOffset字节,这部分是独立的,不会干扰其他条目。 FatOffset+1字节的高4位属于后一个奇数索引的条目,必须保留,再把当前条目的高4位写入低4位,合并后写入。
- 条目的低8位直接写入
验证建议
你可以用已有的GetFatEntry函数配合测试:比如写入一个12位值(比如0x123)到某个索引,再用读取函数读取,看是否能得到相同的值,这样就能快速验证逻辑是否正确。
内容的提问来源于stack exchange,提问作者Yos
相关产品推荐
相关产品推荐

