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

来源:互联网 发布:淘宝网换货预约快递 编辑:程序博客网 时间:2024/05/29 21:36

      最近在项目中调试串口,,总结封装了字符串转化为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