嵌入式系统开发(一)——常用字符处理函数

  字符处理在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个基本字符查询功能函数的实现,可以认识到,很多类似的功能和扩展都是可以通过查表来实现的!关于查表的应用,我还有很多篇幅相关。

posted @ 2015-08-20 11:02  记录学习的点点滴滴  阅读(642)  评论(0编辑  收藏  举报