碰到一个需求,需要把硬件读到的uint8_t类型的16进制数据转化为string类型的字符串。
例如,如果读到到的数据是一个uint8_t类型的数组uint8_t code=[5]={0XAA, 0X01, 0XE3, 0X23, 0X34},需要将其转换为string类型字符串"AA01E32334"
当时考虑到的两个思路:
- 将
code先转换为char字符串数组,再转化为string字符串 - 遍历
code的每一个元素,把每一个元素通过std::to_string转化为string类型的字符子串,然后把所有子串拼接在一起
但是这两个思路有个问题,数据在计算机中进行运算和储存时是以二进制的方式进行的,我们把code中的每一个字符拿出来,不管转成什么其对应的二进制都是同样的,比如0X23对应的二进制是01000110,对应的十进制是35,对应的字符是#,方法1和方法2的区别只不过是将01000110的不同形式转换成了string。而我们需要的是将2和3作为单个的字符依次转成string。
也就是说,对于code中的每个字符,第一步要做的事是将这个16进制数23拆分成2和3,也就是将01000110拆分成0010和0011,然后再使用上述步骤将其转化为string类型的字符串
示例代码如下
#include "stdafx.h"
#include<iostream>
#include<string>
typedef unsigned char uint8_t;
using namespace std;
int main()
{
uint8_t code_roi[5] = { 0XAA, 0X01, 0XE3, 0X23, 0X34 };
string code_str;
for (int i = 0; i < 5;i++)
{
//分离16进制数的"十位"和“个位”
char s1 = char(code_roi[i] >> 4);
char s2 = char(code_roi[i] & 0xf);
//将分离得到的数字转换成对应的ASCII码,数字和字母分开,统一按照小写处理
s1 > 9 ? s1 += 87 : s1 += 48;
s2 > 9 ? s2 += 87 : s2 += 48;
//将处理好的字符放入到string中
code_str.append(1,s1);
code_str.append(1, s2);
}
cout << "code_str=" << code_str << endl;
system("pause");
return 0;
}
版权声明:本文为guanjing_dream原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。