下图为本人512MB诺基亚SD卡根目录的数据,

1(红色处):卷标,也就是名称,我的SD卡名称为WHETA。

2(蓝色处):文件名。

3(紫色处):文件类型。    从蓝色与紫色处,可以看出我的根目录里就一个东西,一张名为TESTV12的BMP位图。

4(褐色处(2个)): 这个是文件开始的簇,注意格式,按照图来,读取的数值为0x0000 0300,但真实表示的数值为0x0000 0003。也就是从第三簇开始的。

然后,我们参照FAT表,找出BMP位图的所存储的位置,以及如何存储的。下图为我FAT1表,

红色为簇1,绿色为簇2,蓝色为簇3。

红色处可以理解为簇1,也可以理解为前8个字节表示为FAT32的表头。

根据根目录的显示,我们所找的图片位于第3簇,也就是蓝色部分,蓝色处得值为0x04000 0000,也就是大端格式的0x0000 0004 这个数字表明,我们的数据开始与簇3,而且1个簇不够存,剩下的存储为簇4。簇4为紫色部分,其值为0xFFFF FF0F也就是完结标志。

总体来时,也就是表示文件从3簇开始,存储了簇3与簇4两个簇。而簇4有几大的可能没有储存满。那么簇4剩下的部分不存储其他文件的数据。下图是上面图片的属性,

图中两处红线,大小为5.67KB,占用空间为8KB。这是因为,每个簇有8个扇区(针对于我卡而言),而每个扇区512Byte,所以,每个簇为4KB,那么我们的BMP文件占用了2个簇,所以占用了8KB存储空间,而其实际大小为5.67KB。

这个FAT32结构非常有效的解决了数据追加的问题,比如,我有两个TXT文件,分别为0.TXT和1.TXT。我首先创建了0.TXT,向里面写了2KB的数据,占用一个簇,假设为簇3。然后我由创建了一个1.TXT文件,同样为2KB数据,占用一个簇,假设为簇4。而现在我要向0.TXT写4KB数据,那么我们就可以先填满簇3,然后寻找一个空闲的簇,假设为簇5,那么只需要改写FAT表的结束标志,将其改为0x0500 0000(小端数据格式)。然后若数据不能填满簇5,则在FAT表中簇5的位置写结束标志0xFFFF FF0F,如果能填满簇5而且还有数据剩下,那么就再找看空闲的簇,直到数据完全存到SD卡内。

那么,就TXT文件而言,是不需要文件头的,需要的是在根目录生成一个相关文件索引,然后指明文件开始的簇,然后把数据存储到相应的簇,然后存满一个簇就刷新一遍FAT表即可。

但是,要生成其他文件就不能那么简单了,比如我希望创建一个BMP位图。那么,我就需要在数据开始前,写一个BMP文件头,当然这个文件头存储于数据的开始处。

我的SD卡内,现在有一张全黑的图片,其文件头如下所示,

其中,红色部分为BMP文件的文件头,占用了54个字节,其后面的00为数据(由于是纯黑的图片)。

1.(红色划线处):定值,为0x424D,即BM。

2.(绿色划线处):位图的文件大小,注意,这里是位图的数据+位图的头文件的大小。

3.(深绿划线处):必须为0,定值。

4.(浅蓝划线处):表示了文件开始到数据开始的位移量。在上图,即表示地址0x000F D600到0x00F D636的位移量,结果为0x36。其小端数据为0x3600 0000。

(注:严格的说,以上14字节的信息为文件头,接下来的40字节为位图信息)

5.(深蓝划线处):表示图像信息描述块大小,也就是接下来的40字节的信息,所以值一般为0x28(转小端之后为0x2800 0000).

6.(紫色划线处):图像宽度,这个就可以自己定义了。我定义的图像宽度为47,16进制小端数据为0x2F00 0000。

7.(深紫划线处):图像高度,这个也是自己定义的。我定义为40,16进制小端数据为0x2800 0000。

8.(蓝绿划线处):0x0100,小端数据,同样为定值。

9.(樱色划线处):0x1800,小端数据,表示为24。也就是RGB图像,所以,图像上每个像素由三个字节表示。

可能值为1,二值化图像 ,图像上每8个像素由1个字节表示。

4,16色图像    ,图像上每4个像素由1个字节表示。

8, 256色图像 ,图像上每2个像素由1个字节表示。

24,RGB图像     ,图像上每1个像素由3个字节表示。

10.(紫色划线处):为0表示不压缩,为1表示8位压缩,为2表示4位压缩。

11.(褐色划线处):图像数据区大小,就是不包含文件头,仅仅为数据区的大小。但是其一定要为4的倍数。

后续数据就不用管了,全写0就OK了。

这里值得一说的是,一个扫描行必须是4的倍数。拿我上面的图像来说,图像规格为47X40。那么一个扫描行为47*3 = 141个字节,但是141并不是4的倍数,与之最接近的4的倍数的数为144(只能加,不能减)。所以,一个到扫描行为144个字节,前141个字节为图片数据,之后的3个字节补0。

那么,图片的数据大小,也就变成了   144(扫描行)*40(图片宽度) = 0x0000 1680,转化为小端,为0x8016 0000。将数据填入褐色划线处,那么位图文件的大小为 0x0000 1680(图片大小) + 0x0000 0036(文件头到数据区偏移量) =  0x16B6 0000。将这个信息填入2(绿色划线处)。

之后再填写相关图片的每个扫描行的信息,即可。

需要FAT32文件层的操作,如果是像我一样的新手,不推荐自己写,因为有许多东西是考虑不到的。简易下载成型的FAT32系统,比如国内比较著名的znFAT,之类的。

SD卡FAT32文件结构(2)---创建与写入BMP位图相关推荐

  1. SD卡FAT32文件系统格式

    一.声明 1.本文来源和主旨 2.本文测试环境 二.SD卡FAT文件系统 1.SD卡FAT32文件系统的整体布局 2.FAT文件系统简介 ① 文件分配表 ② 目录项 三.DBR(DOS BOOT RE ...

  2. 用WinHex查看SD卡FAT32文件系统结构

    一鼓作气,今儿忙里抽个闲,既然前篇"原创猛料"开了个好头,今晚就继续敲一篇补补更,呵呵~ 前段时间自己曾经写了一篇关于sd卡和Fat文件系统的自学笔记(http://blog.ch ...

  3. java bmp rgb数组_将RGB数据写入BMP位图文件

    CFile file; //定义一个文件对象 _ASSERTE(file.Open(CString("E:\\94.bmp"), CFile::modeRead));//打开文件 ...

  4. 将RGB数据写入BMP位图文件

    <span style="font-size:18px;">CFile file; //定义一个文件对象 _ASSERTE(file.Open(CString(&quo ...

  5. SD卡中FAT32文件格式快速入门(图文详细介绍)

    说明: MBR :Master Boot Record ( 主引导记录) DBR :DOS Boot Record ( 引导扇区) FAT :File Allocation Table ( 文件分配表 ...

  6. Android9.0中应用如何通过SAF框架写入外置SD卡

    背景介绍 Overview 基于SAF框架写入外置SD卡网上相关资料比较少,现整理一下具体实现方法,如果是访问主存储,弹出授权后即可正常写入,如果是副卡,在Android9.0上必须要使用SAF框架. ...

  7. STM32完成SD卡的数据写入

    文章目录 一.SD卡模块简介 二.读取SD卡 三.总结 四.参考 一.SD卡模块简介 简介 SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备,由于它体积小.数据传输速度快.可热插拔等优良的特性,被 ...

  8. linux 将img写入硬盘,如何使用Etcher轻松将.img写入Mac上的SD卡

    如果需要从Mac将.img图像文件刻录到SD卡则可能已经发现使用默认的GUI应用程序(例如"磁盘工具")没有特别明显的方法不过不用担心存在一个称为Etcher的出色的免费第三方解决 ...

  9. 1.SD卡初始化、写入、读取、数据比较

    设计目标: 1.sd卡初始化完成 2.往sd卡内的某一扇区写入数据 3.将对应扇区中的数据进行读取 4.比较写入数据与读取数据是否一致 sd卡顶层: sd卡采用spi模式,有片选cs.时钟clk.命令 ...

最新文章

  1. 好程序员分享做HTML5页面你要懂得这些
  2. 领悟Web设计模式(转)
  3. Gitlab服务器搭建
  4. 读书推荐:2017 第一期
  5. 聚类分析1:层次聚类
  6. 英特尔 620 显卡 驱动 七代cpu_英特尔的智能“整体厨房”
  7. 从头开始学一个android activity
  8. mysql递归层次查询
  9. oracle身份管理器,分析Oracle身份管理器的各个元素(下)
  10. 2018/12/13
  11. java 查看虚拟机状态_深入理解java虚拟机学习笔记(四)虚拟机性能监控与故障处理工具...
  12. 程序员都应该知道的 10 大算法
  13. 想成为一个怎样的人?
  14. Python 菜鸟入门 《笨方法学PYthon》、《与孩子一起学编程》
  15. 二路归并排序和多路归并排序
  16. Django菜鸟教程
  17. python 面向对象-成员
  18. Halcon如何创建或生成空白的,全黑或全白的8位图和24位图
  19. intel英特尔NUC主机bug大清除案例
  20. python笔试题110题_吐血整理:110道python面试题(带答案)

热门文章

  1. 详细介绍Deeper Text Understanding for IR with Contextual Neural Language Modeling
  2. python twisted教程_Python使用Twisted总结
  3. 时​钟​周​期​及​秒​(​s​)​ ​毫​秒​(​m​s​)​ ​微​秒​(​μ​s​)​ ​纳​秒​(​n​s​)​ ​皮​秒​(​p​s​)​之​间​转​换
  4. Java、JSP等文章发布系统的设计与实现
  5. locust利用locust-plugins插件,将结果记录到TimescaleDB数据库,用Grafana 绘制结果
  6. pygame模拟下雪场景
  7. 6-10 Strongly Connected Components(30 分)
  8. 最近犯的一个致命错误
  9. Ubuntu22.04 USB转串口驱动
  10. 从ARM7TDMI(-s)角度进入ARM世界