上次介紹了一種字符串轉化為16進制顯示的算法,并封裝成了API,這個API可用于串口收到數據后按16進制顯示字符串,這次介紹串口按16進制發送字符串的算法,使用基于字符類型參數的模板函數實現。算法原理是遍歷字符串,將在區間'0'--'9','A'--'F','a'--'f'的字符轉化成對應的16進制整數(范圍為閉區間0-15),如遇到連續2個可以轉換的字符,則將它們存儲在一個無符號字節內,如遇到不能轉化的字符,則略過繼續。代碼如下:
1
/**
2
@brief 將字符轉化為對應的10進制數整數 ASCII版本
3
* 若字符不能轉化則返回-1
4
*/
5
template<typename charT>
6
inline 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
18
typedef 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
*/
30
template<typename charT>
31
inline 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
*/
62
template<typename charT>
63
inline void StrToHex(const charT* src,CByteArrayEx& ByteArray)
64
{
65
StrToHex(src,select_variable<is_ansi_char<s_charT>::value>(strlen,wcslen)(src),ByteArray);
66
}
/**2
@brief 將字符轉化為對應的10進制數整數 ASCII版本 3
* 若字符不能轉化則返回-14
*/5
template<typename charT>6
inline 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

18
typedef 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,0xFF28
該函數會自動過濾不能轉換的字符,可轉換字符范圍在0--9,a--f,A--F區間 29
*/30
template<typename charT>31
inline 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
*/62
template<typename charT>63
inline void StrToHex(const charT* src,CByteArrayEx& ByteArray)64
{65
StrToHex(src,select_variable<is_ansi_char<s_charT>::value>(strlen,wcslen)(src),ByteArray);66
}



