|
本帖最后由 inthsunshine 于 2024-3-22 22:23 编辑
由于显示屏比较小,目前无法完整显示,出现尾部被截断,显示字符数这个细节还没处理好,软件上已经保存完整的长文件名
gb2312和unicode两个字库,中文显示都依赖这2个文件
实现原理也不难,其实FAT32一整套规范都算简单,自己编写FAT32就不困难,而且还有点意思
FAT32的文件名分短文件名和长文件名两种格式,短文件名就是dos年代的8.3命名规范,超过了就以长文件名储存,其实即使字符数量没超过,比如Aa.txt, 这个文件名其实也是用长文件名保存 ,有点意外吧,因为出现大小写混合的情况,短文件名无法储存
长文件名也有对应的短文件名,比如ABCDEFGHIJK.txt, 其短文件名为ABCDEF~1.txt, 所以它由2部分组成,数个长文件名的目录项+1个短文件名目录项,长文件名和短文件名之间的对应关系是通过校验和来确定的;具体到中文名字,短文件名使用GBK编码(比如 数码.txt),而长文件名使用双字节的unicode编码(比如 数码之家阿.txt),所以我准备了2个字库, 长文件名包含完整的文件名+.+扩展名,而短文件名有单独的扩展名字段
工作流程大致这样:在显示文件列表之前,读取根目录(目前只测试根目录)数据区所有的目录项,剔除无效的项目(比如已删除文件,0字节文件,系统隐含文件),保存在一个结构体数组里,保存了文件名扩展名,文件长度以及开始簇号,然后搜出特定的字库文件名,获取对应的数据区的簇号,然后逐条读取结构体数组,判断是否为长文件名,如果是,从unicode文件里读取点阵数据再显示,同理,如果是短文件名,就从gb2312里读取并显示,如果需要播放,就根据保存的开始簇号,从对应簇号读取多个扇区发给DAC播放,再从FAT表里查找得到下一个簇号,再从簇里读取数据,以此类推,直到读取最后一个簇结束标志,说明文件已结束
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|