加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C++ 16进制字符串CString 如何转为 BYTE[] 数组

(2011-10-28 09:47:17)
标签:

杂谈

分类: Cplusplus
方法一:
转自:http://hi.baidu.com/jetqu2003/blog/item/fef7f7e98e834739b90e2d15.html
需求:
16进制字符串CString 如何转为 BYTE[]
CString str ="01 02 03 04";
BYTE cmd[1024];

赋值后
cmd[1024] = {0X01,0X02,0X03,0X04};

第一步:将ASCII码转化为16进制数(注意:ASCII码和16进制数的区别)

http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />//将ASCII码转化为16进制数
http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />
BYTE CSendDataDlg::ConvertHexChar(BYTE ch)
http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />
{
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    
if((ch>='0')&&(ch<='9'))
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />       
return ch-0x30;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    
else if((ch>='A')&&(ch<='F'))
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />       
return ch-'A'+10;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    
else if((ch>='a')&&(ch<='f'))
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />       
return ch-'a'+10       
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    
else
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />       
return -1;
http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />}

 

第二步:调用上面的那个函数来实现需求

http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />CString str ="01 02 03 04";
http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />BYTE tmpByte
= 0x00;
http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />
int strLen = str.GetLength();
http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />BYTE cmd[
1024];
http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />memset(cmd,
'\0', sizeof(cmd));
http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />
http://www.cppblog.com/Images/OutliningIndicators/None.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />
for (int i=0, j=0; i<1024,j<strLen; i++,j++)
http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />
{
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />   
if (str[j] == ' ')
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    
++j;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    tmpByte
= str[j];        
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    cmd[i]
= ConvertHexChar(tmpByte)<<4;//左移4位
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />
   if (str[++j] == ' ')
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />       
++j;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    tmpByte
= str[j];        
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />    cmd[i]
= cmd[i] + (ConvertHexChar(tmpByte) & 0xF);//取低4位然后相加。    
http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif16进制字符串CString 如何转为 BYTE[] 数组" TITLE="C++ 16进制字符串CString 如何转为 BYTE[] 数组" />
}

注释:
把字符赋给BYTE,实则赋的是字符的ASCII码值,因此要先把ASCII码转化为对应的16进制数。
两个字符赋给一个BYTE,就要把第一个字符放到BYTE的高4位,而第二个字符放到BYTE的低4位。
中间通过判断去掉空格。

方法二:
转自:

需求:
16
进制字符串CString如何转为BYTE[]数组
CString str ="56 45 52 30 30";
BYTE buf[64];

赋值后
buf[64] =  {0X56,0X45,0X52,0X30,0X30};

 

int CCP210xSerialTestDlg::Str2Hex(CString str, unsigned char *data)
{
 unsigned int t;
 int Length;
 int len=str.GetLength();
 char a[10]={0};

 Length=0;

 for(int i=0; i<len; )
 {
  if(str[i]==' ')  //空格
  {
   i++;
   continue;
  }

  a[0]=str[i]; // high byte

  i++;
  if (i>=len)
  {
   break;
  }

  a[1]=str[i]; // low byte

  a[2]='/0';  // 字符串结束标志

  t=strtoul(a,NULL,16);   //将字符串转换成无符号长整型数
  data[Length]=(unsigned char)t;
  Length++;

  i++;
 }

 return Length;  //转换的字节数
}

 

处理这类问题的方法很多,我的方法的特点在于使用了strtoul()函数。

虽然可行,但我还是有疑问,CString类可以直接用数组下标的方式(str[i])访问吗?感觉是不可以这样做,却能解决问题,很纳闷。希望有高手指点一下,不胜感谢。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有