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

普通文件名转换为DOS 8.3格式的算法(适用于Arduino SD卡开发)

8.3短文件名标准转换算法

8.3格式要求文件名由两部分组成:最长8个字符的主文件名、最长3个字符的扩展名,两部分用.分隔,不支持小写字符及大部分特殊符号,具体转换规则如下:

基础转换步骤

  • 统一字符大小写:将原文件名所有小写字符转为大写,8.3格式默认不保留大小写信息
  • 过滤非法字符:删除所有不在0-9、A-Z、!#$%&'()-@^_{}~`范围内的字符
  • 拆分文件名结构:以原文件名最后一个.为分隔符,分隔为主文件名、扩展名两部分,若文件名没有.则扩展名留空
  • 截断扩展名:仅保留扩展名的前3个字符,超出部分直接丢弃
  • 处理主文件名:
    • 若主文件名长度≤8,且当前目录下无重复的短文件名,直接使用原主文件名
    • 若主文件名长度>8,取主文件名的前6个字符,后缀拼接~1,总长度控制在8位以内

重名冲突处理规则

如果同目录下已经存在生成的短文件名,将~后的数字按顺序递增,例如第二个重名文件后缀改为~2、第三个改为~3,以此类推即可。

Arduino平台精简实现示例

// 输入长文件名,输出符合8.3规范的短文件名
void convertTo8dot3(const char* longName, char* shortName) {
  uint8_t namePos = 0, extPos = 0;
  bool isExtPart = false;

  // 清空输出缓冲区,8+1+3+1结束符最大13字节
  memset(shortName, 0, 13);

  for (uint16_t i = 0; longName[i] != '\0'; i++) {
    char c = toupper(longName[i]);
    // 遇到点切换到扩展名处理
    if (c == '.') {
      isExtPart = true;
      continue;
    }
    // 过滤非法字符
    if (!isalnum(c) && c != '!' && c != '#' && c != '$' && c != '%' && c != '&' 
        && c != '\'' && c != '(' && c != ')' && c != '-' && c != '@' 
        && c != '^' && c != '_' && c != '`' && c != '{' && c != '}' && c != '~') {
      continue;
    }
    // 处理主文件名,仅存前6位,留2位空间放~N
    if (!isExtPart && namePos < 6) {
      shortName[namePos++] = c;
    }
    // 处理扩展名,仅存前3位
    else if (isExtPart && extPos < 3) {
      shortName[9 + extPos++] = c;
    }
  }

  // 拼接默认~1后缀,存在重名时可修改为递增序号
  shortName[namePos++] = '~';
  shortName[namePos++] = '1';

  // 填充主名和扩展名的分隔符
  shortName[8] = '.';

  // 裁剪掉尾部的空字符和多余分隔符
  for (int i = 11; i >= 0; i--) {
    if (shortName[i] == '\0' || shortName[i] == '.') {
      shortName[i] = '\0';
    } else {
      break;
    }
  }
}

注意:如果需要处理同目录重名场景,需要额外遍历SD卡当前目录的已有文件列表,匹配到重复短文件名时递增~后的序号即可。

内容的提问来源于stack exchange,提问作者Felix.leg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:24:05