(转)一种字符串转化为16进制显示的算法

      最近在项目中调试串口,,总结封装了字符串转化为16进制显示的算法,串口数据发送一般为ASCII和16进制两种,当收到数据时数据也有ASCII和16进制显示两种方式,下面给出一种转化算法,该算法定义实现两种版本函数:ASCII和UNICODE. 由于算法使用C++标准库的string作为返回字符串,因此是比较通用的.
         算法原理是对字符串内存进行操作转化,以一个字节(unsigned char类型)为单位,分别取其高4位和低4位(范围为0x0--0xF), 转化为对应的ASCII字符('0'--'F')显示,代码如下

 1 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 /**
 2一种字符串转化为16进制显示的算法 - noCom - 放弃了多余   @brief  StrToHex ASCII版本    
 3一种字符串转化为16进制显示的算法 - noCom - 放弃了多余   @param lpSrc  源字符串
 4一种字符串转化为16进制显示的算法 - noCom - 放弃了多余   @param chTag  显示分隔符,默认为0表示空字符
 5一种字符串转化为16进制显示的算法 - noCom - 放弃了多余   @return       返回转化后16进制字符串
 6一种字符串转化为16进制显示的算法 - noCom - 放弃了多余*/

 7 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 static   string  StringToHex(LPCSTR lpSrc,  char  chTag = 0)
 8 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 {
 9一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    string strDest;
10一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    unsigned char* pSrc = (unsigned char*)lpSrc;
11一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    char  buf[2];
12一种字符串转化为16进制显示的算法 - noCom - 放弃了多余
13一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    long dwSize = strlen(lpSrc);
14一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    for (long dwIndex = 0; dwIndex < dwSize; ++dwIndex)
15一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    {
16一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        unsigned char c0 = *pSrc >> 4;  
17一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        if ( c0 >= 0x0 && c0 <= 0x9)
18一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        {
19一种字符串转化为16进制显示的算法 - noCom - 放弃了多余            buf[0= c0 - 0 + '0';
20一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        }

21一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        else 
22一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        {
23一种字符串转化为16进制显示的算法 - noCom - 放弃了多余            buf[0= c0 - 10 + 'A';
24一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        }

25一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        unsigned char c1 = *pSrc++ & 0x0F;
26一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        if ( c1 >= 0x0 && c1 <= 0x9)
27一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        {
28一种字符串转化为16进制显示的算法 - noCom - 放弃了多余            buf[1= c1 - 0 + '0';
29一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        }

30一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        else 
31一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        {
32一种字符串转化为16进制显示的算法 - noCom - 放弃了多余            buf[1= c1 - 10 + 'A';
33一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        }

34一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        strDest += buf[0];
35一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        strDest += buf[1];
36一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        if (0 != chTag)  strDest += chTag;
37一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    }

38一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    return strDest;
39一种字符串转化为16进制显示的算法 - noCom - 放弃了多余}

40 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 /**
41一种字符串转化为16进制显示的算法 - noCom - 放弃了多余  @brief  StrToHex  UNICODE版本
42一种字符串转化为16进制显示的算法 - noCom - 放弃了多余  @param lpSrc  源字符串
43一种字符串转化为16进制显示的算法 - noCom - 放弃了多余  @param chTag  显示分隔符,默认为0表示空字符
44一种字符串转化为16进制显示的算法 - noCom - 放弃了多余  @return       返回转化后16进制字符串
45一种字符串转化为16进制显示的算法 - noCom - 放弃了多余*/

46 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 static  wstring  StringToHex(LPCWSTR lpSrc, wchar_t chTag = 0)
47 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 {
48一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    wstring strDest;
49一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    unsigned char* pSrc = (unsigned char*)lpSrc;
50一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    char  buf[2];
51一种字符串转化为16进制显示的算法 - noCom - 放弃了多余
52一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    long dwSize = wcslen(lpSrc) * sizeof(wchar_t);
53一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    for (long dwIndex = 0; dwIndex < dwSize; ++dwIndex)
54一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    {
55一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        unsigned char c0 = *pSrc >> 4;  
56一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        if ( c0 >= 0x0 && c0 <= 0x9)
57一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        {
58一种字符串转化为16进制显示的算法 - noCom - 放弃了多余            buf[0= c0 - 0 + '0';
59一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        }

60一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        else 
61一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        {
62一种字符串转化为16进制显示的算法 - noCom - 放弃了多余            buf[0= c0 - 10 + 'A';
63一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        }

64一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        unsigned char c1 = *pSrc++ & 0x0F;
65一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        if ( c1 >= 0x0 && c1 <= 0x9)
66一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        {
67一种字符串转化为16进制显示的算法 - noCom - 放弃了多余            buf[1= c1 - 0 + '0';
68一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        }

69一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        else 
70一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        {
71一种字符串转化为16进制显示的算法 - noCom - 放弃了多余            buf[1= c1 - 10 + 'A';
72一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        }

73一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        strDest += (wchar_t)buf[0];
74一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        strDest += (wchar_t)buf[1];
75一种字符串转化为16进制显示的算法 - noCom - 放弃了多余        if (0 != chTag)  strDest += chTag;
76一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    }

77一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    return strDest;
78一种字符串转化为16进制显示的算法 - noCom - 放弃了多余}

79一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 /**
80一种字符串转化为16进制显示的算法 - noCom - 放弃了多余  @def StrToHex
81一种字符串转化为16进制显示的算法 - noCom - 放弃了多余  *  字符串转化为16进制显示    
82一种字符串转化为16进制显示的算法 - noCom - 放弃了多余*/

83 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 #define   StrToHex    StringToHex

     在应用中需要转化时, 只需调用StrToHex宏,示例如下:  

1 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余      string  strDest1  =  StrToHex( " 123456789汉字ABCXYZ " );
2 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余     string  strDest2  =  StrToHex( " 123456789汉字ABCXYZ " '   ' );
3 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    wstring wstrDest1  =  StrToHex(L " 123456789汉字ABCXYZ " );
4 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    wstring wstrDest2  =  StrToHex(L " 123456789汉字ABCXYZ " , L ' , ' );
5 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余
6 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    TRACE4( " %s \n " , strDest1.c_str());
7 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余     TRACE4( " %s \n " , strDest2.c_str());
8 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    TRACE4(L " %s \n " , wstrDest1.c_str());
9 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余    TRACE4(L " %s \n " , wstrDest2.c_str());

     结果输出如下:

1 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 313233343536373839BABAD7D641424358595A 
2 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 31   32   33   34   35   36   37   38   39  BA BA D7 D6  41   42   43   58   59  5A  
3 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余310032003300340035003600370038003900496C575B410042004300580059005A00 
4 一种字符串转化为16进制显示的算法 - noCom - 放弃了多余 31 , 00 , 32 , 00 , 33 , 00 , 34 , 00 , 35 , 00 , 36 , 00 , 37 , 00 , 38 , 00 , 39 , 00 , 49 ,6C, 57 ,5B, 41 , 00 , 42 , 00 , 43 , 00 , 58 , 00 , 59 , 00 ,5A, 00

 

转自: http://www.cppblog.com/qinqing1984/archive/2009/06/27/88636.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值