随笔-95  评论-224  文章-24  trackbacks-0
   上次介绍了一种字符串转化为16进制显示的算法,并封装成了API,这个API可用于串口收到数据后按16进制显示字符串,这次介绍串口按16进制发送字符串的算法,使用基于字符类型参数的模板函数实现。算法原理是遍历字符串,将在区间'0'--'9','A'--'F','a'--'f'的字符转化成对应的16进制整数(范围为闭区间0-15),如遇到连续2个可以转换的字符,则将它们存储在一个无符号字节内,如遇到不能转化的字符,则略过继续。代码如下:
 1/**
 2    @brief 将字符转化为对应的10进制数整数 ASCII版本 
 3    * 若字符不能转化则返回-1
 4*/

 5template<typename charT>
 6inline char ConvertHexChar(charT ch)
 7{
 8    if(ch>=(charT)'0'&&ch<=(charT)'9')
 9        return ch-(charT)'0';
10    else if(ch>=(charT)'A'&&ch<=(charT)'F')
11        return ch-(charT)'A'+10;
12    else if(ch>=(charT)'a'&&ch<=(charT)'f')
13        return ch-(charT)'a'+10;
14    else 
15        return -1;
16}

17
18typedef std::vector<unsigned char> CByteArrayEx;
19
20/**
21    @brief 将字符串转化成对应的16进制数形式存储
22    @param template charT 源字符类型
23    @param src 源数据串
24    @param size 要转换的长度,字符数
25    @param ByteArray 存放结果的字节数组
26
27    * 如字符串80 12 34 46 AD FF,对应的就是0x80,0x12,0x34,0x46,0xAD,0xFF
28    该函数会自动过滤不能转换的字符,可转换字符范围在0--9,a--f,A--F区间   
29*/

30template<typename charT>
31inline void StrToHex(const charT* src,size_t len,CByteArrayEx& ByteArray)
32{
33    char low = -1, high = -1;
34    for (size_t n = 0; n < len; )
35    {
36        high = ConvertHexChar(src[n++]); 
37        if (-1 == high)
38        {
39            continue;
40        }

41        if (n >= len)
42        {
43            ByteArray.push_back(high);
44            break;
45        }

46        low = ConvertHexChar(src[n++]);
47        if (-1 == low)
48        {
49            ByteArray.push_back(high);
50            continue;
51        }

52        ByteArray.push_back(high * 16 + low);  
53    }

54}

55
56/**
57    @brief 将字符串转化成对应的16进制数形式存储
58    @param template charT 源字符类型
59    @param src 源数据串
60    @param ByteArray 存放结果的字节数组  
61*/

62template<typename charT>
63inline void StrToHex(const charT* src,CByteArrayEx& ByteArray)
64{
65    StrToHex(src,select_variable<is_ansi_char<s_charT>::value>(strlen,wcslen)(src),ByteArray);
66}
 
posted on 2009-07-12 16:58 春秋十二月 阅读(2781) 评论(0)  编辑 收藏 引用 所属分类: Algorithm

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理