FATFS配置长文件名,为何跟编码转换有关
要打开FATFS的长文件名功能,必须添加OEMCP与Unicode的编码转换函数,同时也就要把OEMCP与Unicode的编码转换数组添加进来,这是为什么呢?
OEMCP在936代码页下就是GBK,这个编码转换也就是GBK和Unicode互转。FATFS是使用的GBK编码,文件的短文件名也是GBK编码,因此不需要转换,可是文件的长文件名使用的UTF-16编码,这是Unicode的一种编码方式(关于Unicode和UTF-16的关系,去这儿)。因此要读取长文件名必须得先把UTF-16编码的长文件名转换为GBK才可以。
以下如详细内容:
FAT32文件系统在为文件分配短文件名(SFN)目录项的同时会为其分配长文件名(LFN)目录项。SFN目录项中包含了文件名的前8个字符、时间、大小、起始簇号等文件信息,而LFN名目录项中只包含文件的名字。如果一个文件的文件名超过了8个字符,则会为其名字截短后为其建立短文件名。将短文件名存储在短文件名目录项中。长文件名则存放在长文件名目录项中。长文件名(LFN)目录项有以下特点:
1、LFN和SFN目录项结构在相同位置有一个属性标志字节,LFN目录项使用一个特定的属性值,以说明它是一个长文件名项。
2、项中除标志位外的其他字节,使用UTF-16编码,存储13个Unicode字符的文件名,每个字符占用两个字节。
3、如果文件名长于13个字符,则继续为其分配LFN项,直到够用为止。
4、所有LFN都包含一个校验和,通过这个校验和将其与相应的SFN项关联起来。
5、一个文件的所有LFN项按倒序排列在它的SFN项前面,即文件名的第一部分距离SFN是最近的。
一、长文件名目录项数据结构:
详细解释如下:
【1】0x00~0x00:1个字节,长文件名目录项的序列号,一个文件的第一个长文件名序列号为1,然后依次递增。如果是该文件的最后一个长文件名目录项,则将该目录项的序号与0x40进行“或(OR)运算”的结果写入该位置。如果该长文件名目录项对应的文件或子目录被删除,则将该字节设置成删除标志0xE5。
【2】0x01~0x0A:5个字节,长文件名的第1~5个字符。长文件名使用Unicode码,每个字符需要两个字节的空间。如果文件名结束但还有未使用的字节,则会在文件名后先填充两个字节的“00”,然后开始使用0xFF填充。
【3】0x0B~0x0B:1个字节,长目录项的属性标志,一定是0x0F。
【4】0x0C~0x0C:保留。
【5】0x0D~0x0D:1个字节,校验和。如果一个文件的长文件名需要几个长文件名目录项进行存储,则这些长文件名目录项具有相同的校验和。
【6】0x0E~0x19:12个字节,文件名的第6~11个字符,未使用的字节用0xFF填充。
【7】0x1A~0x1B:2个字节,保留。
【8】0x1C~0x1F:4个字节,文件名的第12~13个字符,未使用的字节用0xFF填充。
二、长文件名目录项实例分析
首先我们在根目录下建立一个名字为“amp3foryatoumadebyfgd20090808summer.txt”的文件,然后用winhex来看看它的长文件名目录项,如下图:
上面看的第二幅图就是由“amp3foryatoumadebyfgd20090808summer.txt”文件的短文件名目录项和长文件名目录项组成。最下面的一个目录项就是该文件的短文件名目录项,我们可以看到,“amp3foryatoumadebyfgd20090808summer.txt”文件名被截断,取出前六个字符“AMP3FO”(注意短文件名是不分大小写的),然后加上“~1”,最后加上它的扩展名。由短文件名向上,是它的长文件名目录项。“amp3foryatoumadebyfgd20090808summer.txt”共有39个字符,每个长文件名目录项可以记录13个字符,因此需要3个长文件名目录项。短文件名目录项向上第一个小方框卷定的目录项是它的第一个长文件名目录项,向上依次为2、3号,从每个长文件名目录项的第一个字节可以看出他们的序号。
【1】我们先来看第一个内容:
0x0B字节处的“0F”表示这是一个长文件名目录项。
0x00字节处的“01”表示这是该文件的第一个长文件名目录项。
0x01~0x0A字节处的10个字节为文件名的第1~5个字符“amp3f”。0x0E~0x19子接触的12个字节是文件名的第6~11个字符“oryato”,0x1C~0x1F处的4个字节是文件名的第12~13个字符“um”。
【2】第二个长文件名目录项的第一个字节“02”表示这是该文件的第二个长文件名目录项,各部分字节含义由读者自行分析。
【3】第三个长文件名目录项的第一个字节为“43”,是0x40和0x03进行或运算的结果。说明这是该文件的第3个长文件名目录项,也是最后一个。
【4】 我们分别看3个长文件名目录项0x0D字节处的值——0x8B,这是长文件名目录项的校验和。说明这3个目录项同属一个长文件名目录项。
FATFS配置长文件名,为何跟编码转换有关相关推荐
- 配置 FATFS 支持长文件名
FATFS 版本:Nov 09 14 R0.10c 在 FATFS 已经移植好的基础上,首先打开 ffconf.h 配置文件,找到如下图配置项: 可以将此值从 0 改为 1 使用 static wor ...
- java. xerces转xml_Xerces -C++遇到的xml编码转换问题
前两天收到一个同事提交的一个疑难问题,在进行xml编码时,一些特殊的gbk编码汉字,会转换成乱码.当时大概的看了下,应该是编码转换的格式问题,怀疑为开源库的bug,给出一个简单的解决方案后就没有在关注 ...
- 第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
JSON库 在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能:目前Lua也有几个JSON库,本人用过cjson.dkjson.其中cjson的 ...
- ESP32-IDF给FATFS添加长文件名支持,更改_USE_LFN以支持大于8.3格式的文件名
ESP-IDF 框架下的 FATFS,默认使用的文件名格式是8.3短文件名. 8.3格式,即文件名为8个字节,.后的后缀为3个字节. 所以一旦文件名称超出长度限制,就会造成如下显示. 配置IDF工程, ...
- mac上编码转换工具_25个用于高效编码的Mac工具
mac上编码转换工具 by freeCodeCamp 通过freeCodeCamp 25个用于高效编码的Mac工具 (25 Mac Tools for Productive Coding) 1.现代浏 ...
- php 编码转换 乱码解决
iconv详解: iconv - 字符串按要求的字符编码来转换 iconv有bug ,碰到一些生僻字就会无法转换,当然了配置第二个参数时,可以稍微弥补一下默认缺陷,不至于无法转换是截断,用法如下 ic ...
- linux ubuntu编码转换,Ubuntu中的文件编码转换
find default -type d -exec mkdir -p utf/{} \; find default -type f -exec iconv -f GBK -t UTF-8 {} -o ...
- Java 中文 Unicode 编码转换
Java作为支持多平台的高级程序设计语言自然要支持多种编码方式才能满足程序设计的需要.但是在处理中文&其他编码之间的转换问题时往往出现各种问题,另程序员大伤脑筋.本文着重阐述了Java中文与U ...
- 【文件编码转换】将GBK编码项目转为UTF-8编码项目
需求 因原项目是GBK编码的,现需要使用UTF-8编码.将项目导入UTF-8编码的编辑器后,出现中文乱码. 调研 VsCode 可以转文件编码,但只能一个一个转,对于已经完成一起的项目,操作难免比较麻 ...
最新文章
- 小甲鱼-013元组tuple:上了枷锁的列表
- 监控url_熬夜之作:一文带你了解Cat分布式监控
- 可汉学院python_可汗学院离线版本
- P4897 【模板】最小割树(Gomory-Hu Tree)(网络流/最小割/树形结构)
- 前端学习(11):标题和段落
- PixelShuffle特征图的上采样的方法
- 如何在Ubuntu 14.04上使用Percona XtraBackup创建MySQL数据库的热备份
- 快速搭建论坛系统看这里,社交系统ThinkSNS助你快人一步!!!
- 装机主板抽象工厂模式(Abstract Factory)
- ubuntu 18.04 使用 nvm 安装 nodejs
- SLF4J介绍以及与LOG4J、LOG4J2、LOGBACK整合方法
- Java中的反射与JDK动态代理
- 盘锦哪家计算机学校好,盘锦这所学校上了全国自主招生500强榜单
- 矩阵的模的平方matlab,matlab求矩阵、向量的模
- 如果说这个世界不是真实存在的,只是一段代码,迄今为止你发现了哪些bug?
- maptalks:数据归一化处理与分层设色图层加载
- 基于激活聚类的后门检测:Detecting Backdoor Attacks on Deep Neural Networks by Activation Clustering
- 学讲普通话水平测试软件,普通话智能学习软件
- java转换大小写快捷键_Java 大小写最快转换方式实例代码
- 分形——自然界的几何学
热门文章
- java上传png_java图片上传
- java 判断水仙花_Java实现判断水仙花数
- “万能钥匙”可以打开大脑:脑刺激个性化医疗的新领域
- 在不久的将来,脑控机器人可以给我们喂水、给我们喂食
- JStorm与Storm源码分析(一)--nimbus-data
- 前端小哥玩HTML复选框上瘾,能画logo做视频,还开源成JS库
- 苹果为了不让AirTag被用来跟踪,将推出一个安卓应用
- 显卡暴涨,等等党输了,这我万万没想到啊
- Kubernetes and Cloud Native Meetup (广州站)资料下载
- python练习---模拟sql