最近需要调试加密算法,涉及到字符对齐、传输等,我们都知道普通的char字符串遇到'\0'之后就被截断了,为了不出幺蛾子需要传输过程中一致性。十六进制字符串(md5、RSA证书等都是此格式)。
/*
构造两个参数,一个是BYTE数组,一个是BYTE数组对应的长度,目的是方便后续的for循环进行遍历而不用再此判断。
*/
inline std::string byteToHexStr(unsigned char* byte_arr, int arr_len)
{
std::string hexstr;
//
for (int i = 0; nullptr!=byte_arr && i<arr_len; ++i)
{
char hex1;
char hex2;
/*借助C++支持的unsigned和int的强制转换,把unsigned char赋值给int的值,那么系统就会自动完成强制转换*/
int value = byte_arr[i];
int S = value / 16;
int Y = value % 16;
//将C++中unsigned char和int的强制转换得到的商转成字母
if (S >= 0 && S <= 9)
{
hex1 = (char)(48 + S);
}
else
{
hex1 = (char)(55 + S);
}
//将C++中unsigned char和int的强制转换得到的余数转成字母
if (Y >= 0 && Y <= 9)
{
hex2 = (char)(48 + Y);
}
else
{
hex2 = (char)(55 + Y);
}
//最后一步的代码实现,将所得到的两个字母连接成字符串达到目的
hexstr = hexstr + hex1 + hex2;
}
return hexstr;
}
//
//字符串转byte数组,就是实现如下功能:把一个字符串,比如“E4F1C3A81F”每两位作为一个十六进制数存到一个unsigned char 型的数组(buf)里,buf[0] = 0xE4, buf[1] = 0xF1, buf[2] = 0xC3, buf[3] = 0xA8......。我们知道字符串中的字符在计算机中大小是其ASCII码值,比如E的ASCII值是69,但是E如果作为一个十六进制数,在计算机中的大小是14,所以我们需要找到一种对应关系将字母E(69)->14,同样将第二位的数字字符4(ASCII:52)->4,并将转换后的14放到高4位,4放到低4位即可。
//
inline std::string hexStrToByte(const char* hexstr, int len)
{
std::string byteString;
unsigned char bits;
for (int i = 0; nullptr!= hexstr && i<len; i += 2)
{
if (hexstr[i] >= 'A' && hexstr[i] <= 'F')
{
bits = hexstr[i] - 'A' + 10;
}
else
{
bits = hexstr[i] - '0';
}
//
if (hexstr[i + 1] >= 'A' && hexstr[i + 1] <= 'F')
{
bits = (bits << 4) | (hexstr[i + 1] - 'A' + 10);
}
else
{
bits = (bits << 4) | (hexstr[i + 1] - '0');
}
//
byteString.push_back(bits);
}
return byteString;
}
int main(int argc, char *argv[])
{
unsigned char hex[] = { 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF };
//"00112233445566778899AABBCCDDEEFF"
std::string ii;
for (const auto& it : hex)
{
ii.push_back(it);
}
//std::string oo = byteToHexStr(hex, sizeof(hex) / sizeof(byte));
std::string oo = byteToHexStr((unsigned char*)ii.c_str(), ii.length());
//
std::string ii2 = hexStrToByte(oo.c_str(), oo.length());
//------------------------------------------------------------//
assert(ii == ii2);
return 0;
}