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;
}

 

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