VC++中通过mscomm控件设计串口,串口读回的数据是十六进制的存在Cstring型中,应该怎么取出每位二进制?

VC++中通过mscomm控件设计串口,串口读回的数据是十六进制的存在Cstring型数组中,比如传回的是“A247D2”这样的一组十六进制数,但是存在一个Cstring... VC++中通过mscomm控件设计串口,串口读回的数据是十六进制的存在Cstring型数组中,比如传回的是“A2 47 D2”这样的一组十六进制数,但是存在一个Cstring型数组里。现在我想首先把里面的空格去掉,然后把它转成2进制的“101000100100011111010010”。我想要取其中的几位来做一个数值比较,比如,我要取第三位第五位和第七位,让他们组成一个新的数组,然后能跟我给的一个标准值进行比较是否相同。请教各位大侠了!可以的,我再加分。附上mscomm控件设计串口的读回程序如下:

for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制送入临时变量strtemp存放
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
展开
 我来答
何处淬吴钩
2012-04-14 · TA获得超过5044个赞
知道大有可为答主
回答量:2947
采纳率:50%
帮助的人:2396万
展开全部
转换成2进制无任何意义,白明橘费精力。直接按位与操作即可。取第几位就将第几位置1。参考:

#include <stdlib.h>
#include<stdio.h>

//建议以4字节为单位进行处理
CString str = " A2 47 B5 93";
str.Remove(' '返槐岁);//去除空格
DWORD dwHex;
sscanf(str,"%x",&dwHex);//转换成16进制数dwHex
//取dwHex的第1,4,7,8,11位(从低位开始漏睁计算)
DWORD dwMask = 0x0054;//101 0100 == 0x0054
DWORD dwNew = dwHex&dwMask;
//dwNew就是需要的数
printf("%x\n",dwNew);
更多追问追答
追问
您这里写的是一个32位的,用了DWORD类型,如果我要用的是一个40位的,应该用什么格式呢?另外,您这里是“取dwHex的第1,4,7,8,11位(从低位开始计算)”,为什么会是0x0054呢?是不是应该是0x04C9啊?
追答
在VC中有__int64类型的,64位的。超过64位,你就要用2个或更多整型来处理了,处理好高低位顺序即可。
注释里写错了,应该是第3,5,7位。
xoalyg
2012-04-13 · TA获得超过4178个赞
知道大有可为答主
回答量:2356
采纳率:100%
帮助的人:2369万
展开全部
#include <iostream>

int atoi(char *s, int base) { // 将base进制的字符串转换为整数
int num = 0;
char *p = s;
while(*p) {
if(*p >渣中= 'A') num = base * num + (*p - 'A'旦数 + 10);
else if(*p >= 'a') num = base * num + (*p - 'a' + 10);
else num = base * num + (*p - '0');
++p;
}
return num;
}

int main() {
char aData[7][3]; // 假定共7个数据,每个数据2个字节
int data[7]; // 用于存放转换后的数据
int index = 0;
// ...................................
for(index = 0; index < 7; ++index) {
strcpy(aData[i],strtemp.substr(3 * index,2)); //如迟山截取数据
data[index] = atoi(aData[i],16); // 转换为十进制数
}
// ........................................
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
feng4321985
2012-04-15
知道答主
回答量:14
采纳率:0%
帮助的人:2.3万
展开全部
主要思路就是按位操作,“101000100100011111010010“ 即10100010 01000111 110110010
三个数 分别与(十六进制)04、10、40进行与运算,然后再重新组数据,你问题中没有说明怎么进行重组,多少位侍厅滚?如果是老余以此提取奇数位,就用移位,比伏瞎较好用。提供个思路吧,不求得分,仅供参考。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-04-13
展开全部
编程中宽饥 就是 数据转换 费神!

推荐看书猜巧塌穗圆
Visual C++_Turbo C串口通信编程实践
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式