最近需要調試加密算法,涉及到字符對齊、傳輸等,我們都知道普通的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;
}