嵌入式系统开发(一)——常用字符处理函数
字符处理在C语言中是很普遍的。我们常常需要把信息从字符串形式转换为内部数据,或者反向转换。那怎么样高效的实现这些常用操作呢?
下面介绍我经常使用的方法。在头文件中添加如下内容:
1 #include "ftypes.h" 2 3 extern u8_t const __ascInfoTbl[256]; 4 5 static inline bool_t IsHexChar(u8_t c) { 6 c = __ascInfoTbl[c]; 7 return ((c & 0x01) != 0); 8 } 9 10 static inline bool_t IsNumericChar(u8_t c) { 11 c = __ascInfoTbl[c]; 12 return (c == 0x01); 13 } 14 15 static inline bool_t IsAlphabetChar(u8_t c) { 16 c = __ascInfoTbl[c]; 17 return ((c & 0x02) != 0); 18 } 19 20 static inline bool_t IsUpperCaseAlphabetChar(u8_t c) { 21 c = __ascInfoTbl[c]; 22 return ((c & 0x06) == 0x02); 23 } 24 25 static inline bool_t IsLowerCaseAlphabetChar(u8_t c) { 26 c = __ascInfoTbl[c]; 27 return ((c & 0x06) == 0x06); 28 }
然后在C文件中加入:
u8_t const __ascInfoTbl[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
在头文件中提供了5个常用的字符信息查询函数,通过内联(inline)定义。注意,头文件是给C文件包含的,同时被多个C文件包含。所以应该在头文件定义的内联函数前加上static,用来限定该函数的作用域。
- static inline bool_t IsHexChar(u8_t c) ;
查询给定字符c是不是一个十六进制数字符。十六进制字符包括:'0'到'9','A'到'F'(或者小写'a'到'f')。
- static inline bool_t IsNumericChar(u8_t c);
查询给定字符c是不是一个十进制数字符。十进制字符包括:'0'到'9'。
- static inline bool_t IsAlphabetChar(u8_t c) ;
查询给定字符c是不是一个字母(包括大写和小写)。字母包括:'A'到'Z',(或者小写'a'到'z')。
- static inline bool_t IsUpperCaseAlphabetChar(u8_t c);
查询给定字符c是不是一个大写字母。字母包括:'A'到'Z'。
- static inline bool_t IsLowerCaseAlphabetChar(u8_t c);
查询给定字符c是不是一个小写字母。字母包括:'a'到'z'。
通过这5个基本字符查询功能函数的实现,可以认识到,很多类似的功能和扩展都是可以通过查表来实现的!关于查表的应用,我还有很多篇幅相关。