C++二進制byte轉字符串char

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章