最近做一个实验,需要采集传感器数据,我的方法是通过串口助手将数据保存到TXT文件,然后编写处理程序进行相应的数据处理操作,其中主要的问题有两个:string转byte类型、十六进制转十进制。经查询解决问题后,在此做个记录。
目录
1.C++中string转byte问题
C++中没有byte类型,通常都是用unsigned char来代替byte使用的。因此,为了方便表示,可以利用typedef和unsigned char自定义一个byte类型。
typedef unsigned char BYTE;
有了byte类型后,就是从string到byte的数据类型的转换了。转化的方式有很多,我用的是strtoll函数,能够很简洁的实现string到byte的转换。
其函数原型如下:
unsigned long strtoul(const char *nptr,char **endptr,int base )
参数1:字符串起始地址
参数2:返回字符串有效数字的结束地址,这也是为什么要用二级指针的原因。
参数3:转换基数。当base=0,自动判断字符串的类型,并按10进制输出,例如"0xa",就会把字符串当做16进制处理,输出的为10。更多的下面详细阐述。
具体实现方式如下:
//转换示例
#include<iostream>
#include<string>
using namespace std;
typedef unsigned char BYTE; //自定义byte类型
int main(int argc, char** argv)
{
string str = "ff"; //0xff对应十进制255
BYTE bytes = strtoul(str.c_str(), NULL, 16);
int byte = int(bytes); //强转成int验证转换是否成功
cout << "byte=" << byte << endl;
system("pause");
return 0;
}
输出结果为:
2.十六进制转十进制
在对十六进制数进行操作时,经常会遇到如 33 6a(即0x33 0x6a)这样的数要转换成十进制,33 6a转成十进制数为13162,我们以33 6a为例,用代码实现其转换过程。
实现如下:
#include<iostream>
#include<string>
using namespace std;
typedef unsigned char BYTE;
int main(int argc, char** argv)
{
BYTE a = 0x33;
BYTE b = 0x6a;
int Sym = (a & 0x80) >> 7; //做符号判断,1为负,0为正
cout << "符号为=: " << Sym << endl;
float output;
if (Sym)
{
output = -(((~(a) << 8) & 0xff00) | (~(b) & 0xff) + 0x01) ;
}
else
{
output = ((((a) << 8) & 0xff00) | ((b) & 0xff) ) ;
}
cout << "output=: " << output << endl;
system("pause");
return 0;
}
输出结果为:
以上就是从string转到byte,再将byte十六进制数据转为十进制数据的方式。
3.将C++结果数据保存至excel表格
实现代码如下:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main(int argc, char** argv)
{
ofstream data;
data.open("data.csv", ios::out | ios::trunc);
data << "姓名" << "," << "年龄" << "," << "班级" << "," << "成绩" << endl; //“,”换列,endl换行
data << "李子明" << "," << "18" << "," << "三年二班" << "," << "666" << endl;
data.close();
system("pause");
return 0;
}
如图,输出结果csv文件在项目文件夹中,可以直接用excel打开。
参考:
(35条消息) 很方便的c++字符串转换为16进制_月光如水照缁衣-CSDN博客_c++ 字符串转十六进制
文章评论