碰到一个需求,需要把硬件读到的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;}