AscII码 与 Bin码 转换 记录 (MFC封装版)
一、AscII码 转 Bin
private:
int StrToHex(const uint8_t* _str, uint8_t* _hexStr); //AscII码转16进制
void numToHexStr(uint8_t _hexNum, uint8_t* _hexStr);
public:
CString Ascii2Hex(CString str_ASCII);
void CodesConvert::numToHexStr(uint8_t _hexNum, uint8_t* _hexStr)
{
uint8_t tmp;
if(NULL == _hexStr)
{
return;
}
//低4bit
tmp = (_hexNum >> 4) & 0x0f;
if(tmp <= 9)
*_hexStr = tmp+'0';
else
*_hexStr = tmp-0x0a + 'A';
_hexStr++;
//高4bit
tmp = _hexNum & 0x0f;
if(tmp <= 9)
*_hexStr = tmp+'0';
else
*_hexStr = tmp-0x0a + 'A';
//加空格
_hexStr++;
*_hexStr = ' ';
}
int CodesConvert::StrToHex(const uint8_t* _str, uint8_t* _hexStr)
{
int i;
int len;
uint8_t* resultPtr;
if(NULL == _str || NULL == _hexStr)
{
return -1;
}
len = strlen((const char*)_str);
resultPtr = _hexStr;
for(i=0; i<len; i++)
{
numToHexStr(_str[i], resultPtr);
//resultPtr += 2;
resultPtr += 3;
}
//将不需要的空格变为 '\0'
len = strlen((const char*)_hexStr);
resultPtr[len-2] = '\0';
len = strlen((const char*)_hexStr);
return len;
}
CString CodesConvert::Ascii2Hex(CString str_ASCII)
{//转HEX
char c1 [1024] = {0};
char c2 [2024] = {0};
CString str;
strcpy(c1, str_ASCII);
CodesConvert::StrToHex((uint8_t *)c1, (uint8_t *)c2);
str = c2;
return str;
}
二、Bin码 转 AscII码
CString CodesConvert::Hex2Ascii(CString str_HEX)
{//转ASCII
int i,num,cnt;
BOOL is_space = FALSE;
int length = str_HEX.GetLength();//CString类型的HEX
CString str_ASCII;//最终转换出的ASCII
char* char_ASCII = (char*)malloc(length*sizeof(char));//实际上远远小于这个数据
memset(char_ASCII, 0, length*sizeof(char));
str_ASCII.Empty();
char char_temp;
num = 0;
cnt = 0;
for (i=0; i<length; i++)
{
char_temp = str_HEX.GetAt(i);
if (' '==char_temp || '\n'==char_temp || '\t'==char_temp || '\r'==char_temp)
{
if (FALSE == is_space)
{
is_space = TRUE;
num++;
}
continue;//如果是空格,直接进入下一个
}
if (char_temp>='0' && char_temp<='9')
{
char_ASCII[num] = char_ASCII[num]*16 + char_temp - '0';
cnt++;
is_space = FALSE;//说明这一拍 不是空格
}
if (char_temp>='a' && char_temp<='z')
{
char_ASCII[num] = char_ASCII[num]*16 + char_temp - 'a' + 10;
cnt++;
is_space = FALSE;//说明这一拍 不是空格
}
if (char_temp>='A' && char_temp<='Z')
{
char_ASCII[num] = char_ASCII[num]*16 + char_temp - 'A' + 10;
cnt++;
is_space = FALSE;//说明这一拍 不是空格
}
if (cnt>=2)
{
cnt = 0;
num++;
is_space = TRUE;
}
}
for (i=0; i<=num; i++)
{
str_ASCII.AppendChar(char_ASCII[i]);
}
free(char_ASCII);
return str_ASCII;
}