You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
    }
}

关键逻辑解释

  1. 值的范围限制:先做value &= 0x0FFF,确保写入的是12位有效值,防止高位数据意外破坏相邻条目。
  2. 奇数索引处理:
    • 不能直接覆盖FatOffset字节,因为它的低4位属于前一个偶数索引的条目,必须先保留这部分。
    • 条目的高4位(value >>8 &0x0F)要左移4位,放到FatOffset字节的高4位,再和保留的低4位合并写入。
    • 条目的低8位直接写入FatOffset+1字节即可,这部分不会影响其他条目。
  3. 偶数索引处理:
    • 条目的低8位直接写入FatOffset字节,这部分是独立的,不会干扰其他条目。
    • FatOffset+1字节的高4位属于后一个奇数索引的条目,必须保留,再把当前条目的高4位写入低4位,合并后写入。

验证建议

你可以用已有的GetFatEntry函数配合测试:比如写入一个12位值(比如0x123)到某个索引,再用读取函数读取,看是否能得到相同的值,这样就能快速验证逻辑是否正确。

内容的提问来源于stack exchange,提问作者Yos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:18:17