(转)一种字符串转化为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/**
2 @brief StrToHex ASCII版本
3 @param lpSrc 源字符串
4 @param chTag 显示分隔符,默认为0表示空字符
5 @return 返回转化后16进制字符串
6*/
7static string StringToHex(LPCSTR lpSrc, char chTag = 0)
8{
9 string strDest;
10 unsigned char* pSrc = (unsigned char*)lpSrc;
11 char buf[2];
12
13 long dwSize = strlen(lpSrc);
14 for (long dwIndex = 0; dwIndex < dwSize; ++dwIndex)
15 {
16 unsigned char c0 = *pSrc >> 4;
17 if ( c0 >= 0x0 && c0 <= 0x9)
18 {
19 buf[0] = c0 - 0 + '0';
20 }
21 else
22 {
23 buf[0] = c0 - 10 + 'A';
24 }
25 unsigned char c1 = *pSrc++ & 0x0F;
26 if ( c1 >= 0x0 && c1 <= 0x9)
27 {
28 buf[1] = c1 - 0 + '0';
29 }
30 else
31 {
32 buf[1] = c1 - 10 + 'A';
33 }
34 strDest += buf[0];
35 strDest += buf[1];
36 if (0 != chTag) strDest += chTag;
37 }
38 return strDest;
39}
40/**
41 @brief StrToHex UNICODE版本
42 @param lpSrc 源字符串
43 @param chTag 显示分隔符,默认为0表示空字符
44 @return 返回转化后16进制字符串
45*/
46static wstring StringToHex(LPCWSTR lpSrc, wchar_t chTag = 0)
47{
48 wstring strDest;
49 unsigned char* pSrc = (unsigned char*)lpSrc;
50 char buf[2];
51
52 long dwSize = wcslen(lpSrc) * sizeof(wchar_t);
53 for (long dwIndex = 0; dwIndex < dwSize; ++dwIndex)
54 {
55 unsigned char c0 = *pSrc >> 4;
56 if ( c0 >= 0x0 && c0 <= 0x9)
57 {
58 buf[0] = c0 - 0 + '0';
59 }
60 else
61 {
62 buf[0] = c0 - 10 + 'A';
63 }
64 unsigned char c1 = *pSrc++ & 0x0F;
65 if ( c1 >= 0x0 && c1 <= 0x9)
66 {
67 buf[1] = c1 - 0 + '0';
68 }
69 else
70 {
71 buf[1] = c1 - 10 + 'A';
72 }
73 strDest += (wchar_t)buf[0];
74 strDest += (wchar_t)buf[1];
75 if (0 != chTag) strDest += chTag;
76 }
77 return strDest;
78}
79/**
80 @def StrToHex
81 * 字符串转化为16进制显示
82*/
83#define StrToHex StringToHex
2 @brief StrToHex ASCII版本
3 @param lpSrc 源字符串
4 @param chTag 显示分隔符,默认为0表示空字符
5 @return 返回转化后16进制字符串
6*/
7static string StringToHex(LPCSTR lpSrc, char chTag = 0)
8{
9 string strDest;
10 unsigned char* pSrc = (unsigned char*)lpSrc;
11 char buf[2];
12
13 long dwSize = strlen(lpSrc);
14 for (long dwIndex = 0; dwIndex < dwSize; ++dwIndex)
15 {
16 unsigned char c0 = *pSrc >> 4;
17 if ( c0 >= 0x0 && c0 <= 0x9)
18 {
19 buf[0] = c0 - 0 + '0';
20 }
21 else
22 {
23 buf[0] = c0 - 10 + 'A';
24 }
25 unsigned char c1 = *pSrc++ & 0x0F;
26 if ( c1 >= 0x0 && c1 <= 0x9)
27 {
28 buf[1] = c1 - 0 + '0';
29 }
30 else
31 {
32 buf[1] = c1 - 10 + 'A';
33 }
34 strDest += buf[0];
35 strDest += buf[1];
36 if (0 != chTag) strDest += chTag;
37 }
38 return strDest;
39}
40/**
41 @brief StrToHex UNICODE版本
42 @param lpSrc 源字符串
43 @param chTag 显示分隔符,默认为0表示空字符
44 @return 返回转化后16进制字符串
45*/
46static wstring StringToHex(LPCWSTR lpSrc, wchar_t chTag = 0)
47{
48 wstring strDest;
49 unsigned char* pSrc = (unsigned char*)lpSrc;
50 char buf[2];
51
52 long dwSize = wcslen(lpSrc) * sizeof(wchar_t);
53 for (long dwIndex = 0; dwIndex < dwSize; ++dwIndex)
54 {
55 unsigned char c0 = *pSrc >> 4;
56 if ( c0 >= 0x0 && c0 <= 0x9)
57 {
58 buf[0] = c0 - 0 + '0';
59 }
60 else
61 {
62 buf[0] = c0 - 10 + 'A';
63 }
64 unsigned char c1 = *pSrc++ & 0x0F;
65 if ( c1 >= 0x0 && c1 <= 0x9)
66 {
67 buf[1] = c1 - 0 + '0';
68 }
69 else
70 {
71 buf[1] = c1 - 10 + 'A';
72 }
73 strDest += (wchar_t)buf[0];
74 strDest += (wchar_t)buf[1];
75 if (0 != chTag) strDest += chTag;
76 }
77 return strDest;
78}
79/**
80 @def StrToHex
81 * 字符串转化为16进制显示
82*/
83#define StrToHex StringToHex
在应用中需要转化时, 只需调用StrToHex宏,示例如下:
1 string strDest1 = StrToHex("123456789汉字ABCXYZ");
2 string strDest2 = StrToHex("123456789汉字ABCXYZ", ' ');
3 wstring wstrDest1 = StrToHex(L"123456789汉字ABCXYZ");
4 wstring wstrDest2 = StrToHex(L"123456789汉字ABCXYZ", L',');
5
6 TRACE4("%s \n", strDest1.c_str());
7 TRACE4("%s \n", strDest2.c_str());
8 TRACE4(L"%s \n", wstrDest1.c_str());
9 TRACE4(L"%s \n", wstrDest2.c_str());
2 string strDest2 = StrToHex("123456789汉字ABCXYZ", ' ');
3 wstring wstrDest1 = StrToHex(L"123456789汉字ABCXYZ");
4 wstring wstrDest2 = StrToHex(L"123456789汉字ABCXYZ", L',');
5
6 TRACE4("%s \n", strDest1.c_str());
7 TRACE4("%s \n", strDest2.c_str());
8 TRACE4(L"%s \n", wstrDest1.c_str());
9 TRACE4(L"%s \n", wstrDest2.c_str());
结果输出如下:
1313233343536373839BABAD7D641424358595A
231 32 33 34 35 36 37 38 39 BA BA D7 D6 41 42 43 58 59 5A
3310032003300340035003600370038003900496C575B410042004300580059005A00
431,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,
231 32 33 34 35 36 37 38 39 BA BA D7 D6 41 42 43 58 59 5A
3310032003300340035003600370038003900496C575B410042004300580059005A00
431,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
- (转)一种字符串转化为16进制显示的算法
- 串口应用: 一种字符串转化为16进制显示的算法
- bash 把文本显示的16进制字符串转化为对应字符串
- 字符串转换为HashKey的一种算法
- 16进制字符串转化为数字
- 16进制字符串转化为颜色
- 二进制转化为16进制字符串
- 算法(二)字符串转化为整数
- 20120820-[转]16进制字符串转化为10进制数
- 16进制转化为八进制,字符串(很大的数字)
- unity 16位进制字符串转化为10进制字符串
- 将string字符串转化为16进制字符串
- 面试题: 十进制INT数字转化为16进制字符串、实现字符串和数字的相互转化
- 整数转化为任意n进制的字符串
- C++将十进制数字转化为X 进制的字符串
- 将接收到的IP地址转化为字符串显示(代码)
- 字符串转化为整数的算法改进及优化
- 字符串转化为整数的算法改进及优化
- VBS脚本常用经典代码收集
- C# 反射机制
- 频繁用电脑打字 武汉大三女生求职"提笔忘字"
- C语言malloc\free
- 天气插件
- (转)一种字符串转化为16进制显示的算法
- 如何调用WebService
- ramdisk.img system.img userdata.img的介绍和使用
- (转)CIniFile类,读取INI文件
- 谈.Net委托与线程——创建无阻塞的异步调用
- 电脑打字习惯让人提笔忘字
- 用My97DatePicker控件的时候老是跑到上一个页面的解决办法
- WINDOWS 2K Dll 加载过程
- maven2之m2eclipse使用手册之五添加新的依赖项目到本地仓库