字符转换MFC

本文介绍了一种将十六进制字符串转换为字节数据的方法,并提供了详细的C++实现代码。包括字符串转十六进制字节数组、十六进制字节转字符串的功能,适用于通信协议数据包的构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值