网站首页 > 博客文章 正文
摘要:对于嵌入式开发,INI文件使用门槛低、用途广,掌握一个稳定的开源INI解析器可以提升编码效率、避免重复造轮子。另外,对于一个C初学者,MinIni代码严谨且健壮,API设计合理,是一个非常适合用来练习文本读写、字符串操作的开源项目。
因为minINI处理文件,所以它需要某种文件系统。对于较小的系统或较小的数据量,随着代码大小和数据需求的增加,这增加了复杂性。
minIni是什么?
https://github.com/compuphase/minIni
minIni是一个用于读取和写入INI文件的库。
什么是INI文件?
INI 是一种有简单语法的纯文本文件,例如:
[Network]
hostname=My Computer
address=dhcp
dns=192.168.1.1
timeout=10
[Network] 是一个 Section,Section 下面有多个键值对。INI文件的特点是简单易用、可读性好。
Linux系统etc目录下的许多配置文件都是INI文件,只是有的配置文件没有显式声明Section。
例如bluez的配置文件 /etc/bluetooth/main.conf:
[General]
# Default adaper name
Name = BlueZ
[Policy]
# AutoEnable defines option to enable all controllers when they are found.
AutoEnable=true
minIni的几个特点:
- minIni 大约是 950 行代码 (包括注释),是一个真正的 “迷你” INI 文件解析器,非常容易移植到各种嵌入式平台。
- minIni 不需要标准 C/C++ 库中的 文件 I/O 函数,且允许通过宏配置要选择文件 I/O 接口。
- minIni 仅使用 stack ,完全不使用动态内存(malloc)。
- 有 C++ binding, 能很好地配合 C++ 使用。
minIni怎么用?
minIni的核心源码就一个.c 和.h 文件,我们直接将它们集成到项目代码里即可。快速地了解它的 API:
#include "minIni.h"
#define sizearray(a) (sizeof(a) / sizeof((a)[0]))
const char inifile[] = "example.ini";
int main(void)
{
char str[100];
char section[50];
long n;
n = ini_gets("Network", "address", "dummy", str, sizearray(str), inifile);
if (n >= 0) printf("Network/address=%s", str);
n = ini_getl("Network", "timeout", -1, inifile);
printf("Network/timeout=%ld\n", n);
待解析的文件内容:
[Network]
hostname=My Computer
address=dhcp
dns=192.168.1.1
timeout=10
运行结果:
Network/address=dhcp
Network/timeout=10
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
点击这里找小助理0元领取:加微信领取资料
ini_gets() 用于获取字符串类型的值。参数 1 是 Section name; 参数 2 是 Key name; 参数 3 是获取不到值时的默认值; 参数 4 是用于保存目标键值的 Buffer; 参数 5 是 Buffer 的长度; 参数 6 是 INI 文件的路径; ini_getl() 用于获取整型类型的值,参数的含义和ini_gets()大同小异。完整的API列表:
minIni 的内部实现?
我简单地浏览过 minIni 的实现代码,感觉良好。想实现解析INI文件的功能并不难,难的是要认真考虑各种边界情况和异常情况,保证程序的健壮性和 API 的合理性。
以ini_gets()为例:
就是先打开文件,然后用getkeystring()找到目标键值,最后拷贝给调用者。
getkeystring()负责真正地解析文本:
大约有80行代码,我简单地总结一下思路:
- 用fgets进行逐行读取,用strrchr 找到包含 '[' 和 ']' 的行,然后再用 strncasecmp找到目标Secntion所在的行。
- 继续用fgets进行逐行读取,用strrchr找到包含'='的行,然后再用 strncasecmp找到目标Key所在的行。
- 用strncpy将目标Key的值拷贝给调用者。
虽然解析文本只需要做到这3个步骤,但是由于需要对各种边界情况进行判断,以及处理空格之类的无效字符,所以需要细心且反复调试才能编写好这个函数。
8、内存要求
当然,每个功能都会带来一些成本。但在这种情况下,我认为它真的是最小的。
为了在闪存中存储数据,它至少需要一个扇区或闪存页。其大小取决于所使用的系统,例如1 kByte(LPC845)或2 KByte(Kinetis K22),具体取决于微控制器。大小配置为McuMinINI_CONFIG_FLASH_NVM_BLOCK_SIZE。
对于写入访问,它需要一个RAM缓冲区来备份和存储来自FLASH的数据。该金额McuMinINI_CONFIG_FLASH_NVM_MAX_DATA_SIZE配置。最小值为64个字节。根据要存储的数据量,128或256可能更合理。对于只读访问,缓冲区量为零。根据所使用的微控制器和SDK,需要闪存驱动程序的设备句柄:例如,在Kinetis上,这需要额外的100字节。对于像LP845这样的其他产品,不需要手柄,因为ROM例程用于闪存编程。
在Kinetis上,只读配置会增加大约 6 KB 的代码大小(-O0,无优化),而使其读写会增加额外的3 KB(-O0)。添加shell支持会增加额外的1 KB:因此这意味着最多需要10KB的闪存,在启用优化后降至约6KB。到目前为止,还不到完整的文件系统支持,很容易是30-50KB的闪存。
总结
对于嵌入式开发,INI文件使用门槛低、用途广,掌握一个稳定的开源INI解析器可以提升编码效率、避免重复造轮子。对于一个C初学者,MinIni代码严谨且健壮,API设计合理,是一个非常适合用来练习文本读写、字符串操作的开源项目,值得一看。
文章链接:
https://mp.weixin.qq.com/s/JnTWNxdh-MBwASHAmjtBvw
转载自:果果小师弟
文章来源:老吴嵌入式 ,作者吴伟东Jack
文章链接:超级好用的配置文件解析器:minIni
- 上一篇: windows常见后门和Linux常见后门
- 下一篇: RmlUi:探索C++图形用户界面的璀璨明珠
猜你喜欢
- 2025-01-15 kubernetes快速安装部署指南
- 2025-01-15 一文带你看懂vue基础语法、生命周期、指令、监听器、依赖注入
- 2025-01-15 美国工程合同中常见的招投标条款(中英文对照)
- 2025-01-15 JNI接口操作最佳实践(三)
- 2025-01-15 java基础都在这了,小主们拿去吧
- 2025-01-15 写作技巧——这些情况下,必须加连字符
- 2025-01-15 「云原生」k8s中volumeMounts.subPath的巧妙用法
- 2025-01-15 RmlUi:探索C++图形用户界面的璀璨明珠
- 2025-01-15 windows常见后门和Linux常见后门
- 2025-01-15 Diagnosis and Prevention of Viral Infection
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- messagesource (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)