字符轉換MFC

#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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章