字符串16进制存储

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

/**
 *    @brief 将字符转化为对应的10进制数整数 ASCII版本 
 *    * 若字符不能转化则返回-1
 */
 template<typename charT>
 inline char ConvertHexChar(charT ch)
 {
     if(ch>=(charT)'0'&&ch<=(charT)'9')
         return ch-(charT)'0';
    else if(ch>=(charT)'A'&&ch<=(charT)'F')
        return ch-(charT)'A'+10;
    else if(ch>=(charT)'a'&&ch<=(charT)'f')
        return ch-(charT)'a'+10;
    else 
        return -1;
}

typedef std::vector<unsigned char> CByteArrayEx;

/**
 *   @brief 将字符串转化成对应的16进制数形式存储
 *  @param template charT 源字符类型
 *   @param src 源数据串
 *  @param size 要转换的长度,字符数
 *   @param ByteArray 存放结果的字节数组

  
 * 如字符串80 12 34 46 AD FF,对应的就是0x80,0x12,0x34,0x46,0xAD,0xFF
 *  该函数会自动过滤不能转换的字符,可转换字符范围在0--9,a--f,A--F区间   
 */
template<typename charT>
inline void StrToHex(const charT* src,size_t len,CByteArrayEx& ByteArray)
{
    char low = -1, high = -1;
    for (size_t n = 0; n < len; )
    {
        high = ConvertHexChar(src[n++]); 
        if (-1 == high)
        {
            continue;
        }
        if (n >= len)
        {
            ByteArray.push_back(high);
            break;
        }
        low = ConvertHexChar(src[n++]);
        if (-1 == low)
        {
            ByteArray.push_back(high);
            continue;
        }
        ByteArray.push_back(high * 16 + low);  
    }
}

/**
 *   @brief 将字符串转化成对应的16进制数形式存储
 *   @param template charT 源字符类型
 *   @param src 源数据串
 *   @param ByteArray 存放结果的字节数组  
 */
template<typename charT>
inline void StrToHex(const charT* src,CByteArrayEx& ByteArray)
{
    StrToHex(src,select_variable<is_ansi_char<s_charT>::value>(strlen,wcslen)(src),ByteArray);
}

转自:http://www.cppblog.com/qinqing1984/archive/2009/07/12/89877.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值