#include "StdAfx.h"
#include "./stringchang.h"
CStringChang::CStringChang(void)
{
}
CStringChang::~CStringChang(void)
{
}
// 將字符串轉換爲16進制,倆個字符間插入了一個空格
int CStringChang::String2Hex(CString str, CByteArray& senddata)
{
int hexdata, lowhexdata;
int hexdatalen = 0;
int len = str.GetLength();
senddata.SetSize(len/2);
for (int i = 0; i < len; )
{
char lstr, hstr = str[i];
if (hstr == ' ') //如果遇到空格則跳過
{
i++;
continue;
}
i++;
if (i >= len)
break;
lstr = str[i];
if ((hexdata = ConvertHexChar(hstr)) == -1)
{
AfxMessageBox("輸入字符超出16進制範圍,無法按16進制正常發送",MB_ICONERROR); //將高字符轉換爲16進制字符
return -1;
}
if ((lowhexdata = ConvertHexChar(lstr)) == -1) //再將低字符轉換爲16進制字符
{
AfxMessageBox("輸入字符超出16進制範圍,無法按16進制正常發送",MB_ICONERROR); //將高字符轉換爲16進制字符
return -1;
}
if ((hexdata ==16) || (lowhexdata == 16))
break; //如果這倆個字符中任意一個大於16則跳出
else
hexdata = hexdata*16 + lowhexdata; //否則把倆個字符疊加
i++;
senddata[hexdatalen] = (char)hexdata; //保存到要發送的緩衝區中
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
// 將一個字符轉換爲相應的十六進制
char CStringChang::ConvertHexChar(char ch)
{
if ((ch >= '0') && (ch <= '9'))
return ch - 0x30;
else if ((ch >= 'A') && (ch <= 'F'))
return ch - 'A' + 10;
else if ((ch >= 'a') && (ch <= 'f'))
return ch - 'a' + 10;
else
return (-1);
}
//可打印字符串轉換爲字節數據
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// 輸入: pSrc 源字符串
// 輸出: pDst 字節數據
// 返回: 字節數據長度
int CStringChang::String2Bytes(const char* pSrc, int nSrcLength, unsigned char* pDst)
{
for (int i = 0; i < nSrcLength; i += 2)
{
// 輸出高4位
if ((*pSrc >= '0') && (*pSrc <= '9'))
{
*pDst = (*pSrc - '0') << 4;
}
else
{
if ((*pSrc >= 'a') && (*pSrc <= 'f'))
{
*pDst = (*pSrc - 'a' + 10) << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
}
}
pSrc++;
// 輸出低4位
if ((*pSrc>='0') && (*pSrc<='9'))
{
*pDst |= *pSrc - '0';
}
else
{
if((*pSrc >= 'a') && (*pSrc <= 'f'))
{
*pDst |= *pSrc - 'a' + 10;
}
else
{
*pDst |= *pSrc - 'A' + 10;
}
}
pSrc++;
pDst++;
}
return (nSrcLength)/2;
}
// 兩個字節高地位轉換
unsigned short CStringChang::lowhigh(unsigned short* pRes)
{
int highbt = *pRes<<8;
int lowbt = *pRes>>8 ;
short highlow = highbt | lowbt;
return highlow;
}
// 字節數據轉換爲可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// 輸入: pSrc - 源數據指針
// nSrcLength - 源數據長度
// 輸出: pDst - 目標字符串指針
// 返回: 目標字符串長度
int CStringChang::Bytes2String(const unsigned char* pSrc, int nSrcLength, char* pDst)
{
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
for (int i = 0; i < nSrcLength; i++)
{
*pDst++ = tab[*pSrc >> 4]; // 輸出高4位
*pDst++ = tab[*pSrc & 0x0f]; // 輸出低4位
pSrc++;
}
// 輸出字符串加個結束符
*pDst = '/0';
// 返回目標字符串長度
return (nSrcLength * 2);
}