将uint8_t类型的16进制字符转化转换为string字符串

碰到一个需求,需要把硬件读到的uint8_t类型的16进制数据转化为string类型的字符串。
例如,如果读到到的数据是一个uint8_t类型的数组uint8_t code=[5]={0XAA, 0X01, 0XE3, 0X23, 0X34},需要将其转换为string类型字符串"AA01E32334"
当时考虑到的两个思路:

  1. code先转换为char字符串数组,再转化为string字符串
  2. 遍历code的每一个元素,把每一个元素通过std::to_string转化为string类型的字符子串,然后把所有子串拼接在一起

但是这两个思路有个问题,数据在计算机中进行运算和储存时是以二进制的方式进行的,我们把code中的每一个字符拿出来,不管转成什么其对应的二进制都是同样的,比如0X23对应的二进制是01000110,对应的十进制是35,对应的字符是#,方法1和方法2的区别只不过是将01000110的不同形式转换成了string。而我们需要的是将2和3作为单个的字符依次转成string。

也就是说,对于code中的每个字符,第一步要做的事是将这个16进制数23拆分成2和3,也就是将01000110拆分成00100011,然后再使用上述步骤将其转化为string类型的字符串
示例代码如下

#include "stdafx.h"
#include
#include
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;
}

你可能感兴趣的:(C++学习笔记,c++,c语言,开发语言)