字符转换MFC

来源:互联网 发布:mac iphoto照片在哪里 编辑:程序博客网 时间:2024/05/03 10:54

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

原创粉丝点击