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; //加入接收编辑框对应字符串
} 展开
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; //加入接收编辑框对应字符串
} 展开
4个回答
展开全部
转换成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);
#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位。
展开全部
#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;
}
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主要思路就是按位操作,“101000100100011111010010“ 即10100010 01000111 110110010
三个数 分别与(十六进制)04、10、40进行与运算,然后再重新组数据,你问题中没有说明怎么进行重组,多少位侍厅滚?如果是老余以此提取奇数位,就用移位,比伏瞎较好用。提供个思路吧,不求得分,仅供参考。
三个数 分别与(十六进制)04、10、40进行与运算,然后再重新组数据,你问题中没有说明怎么进行重组,多少位侍厅滚?如果是老余以此提取奇数位,就用移位,比伏瞎较好用。提供个思路吧,不求得分,仅供参考。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-04-13
展开全部
编程中宽饥 就是 数据转换 费神!
推荐看书猜巧塌穗圆
Visual C++_Turbo C串口通信编程实践
推荐看书猜巧塌穗圆
Visual C++_Turbo C串口通信编程实践
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询