8进制字符串转16进制字符串(一)

//写一个函数实现8进制字符串到16进制字符串的转换
//例如:
//输入"755"结果是"1ED"
//输入"777777777777"结果是"FFFFFFFFF" (注意超过了32位)

//答案1
//C99的标准支持long long类型,能满足超过32位的数据小于64位的数据
#include <iostream.h>
#include <string.h>

//8进制字符串转16进制字符串
//注:要保证pHexStr指向内存空间的长度
bool ConvertOctalStrToHexStr(const char* pOctalStr, char* pHexStr)
{
	int nNum = 0;
	int nLength = 0;             //保存8进制字符串的长度
	int nHexCount = -1;          //保存16进制数的位数
	int nRemainder = 0;          //保存余数
	char* pHexNumStr = NULL; 
	long long int64DecNum = 0;   //10进制64位数
	long long int64TmpNum = 0;

	//检查
	if (pOctalStr == NULL || pHexStr == NULL)
	{
		return false;
	}

	//获取8进制字符串的长度
	nLength = strlen(pOctalStr);

	//8进制数转10进制
	for (int i = nLength - 1; i >= 0 ; i--)
	{
		//8进制的数必须在0~7之间
		if (pOctalStr[i] < '0' || pOctalStr[i] > '7')
		{
			return false;
		}

		//求8的n次方
		int64TmpNum = 1;
		for (int j = 0; j < nLength-i-1; j++)
		{
			int64TmpNum *= 8;
		}
		
		//字符转数据如,'0'->0
		nNum = pOctalStr[i] - 48;

		int64DecNum += nNum*int64TmpNum;
	}

	//申请内存空间放16进制数的字符串
	pHexNumStr = new char[nLength];   
	if (pHexNumStr == NULL)
	{
		return false;
	}
	//清零
	memset(pHexNumStr, 0, nLength);

	//10进制转16进制
	while (true)
	{
		nHexCount++;
		nRemainder = int64DecNum % 16;
		if (nRemainder >= 0 && nRemainder <= 9)
		{
			nRemainder += 48;
		}

		if (nRemainder >= 10 && nRemainder <= 15)
		{
			nRemainder += 55;
		}
		pHexNumStr[nHexCount] = nRemainder;
		
		int64DecNum /= 16;
		if (int64DecNum == 0)
		{
			break;
		}
	}
	
	for (int k = 0; k <= nHexCount; k++)
	{
		pHexStr[k] = pHexNumStr[nHexCount - k];
	}

	//释放内存空间
	if (pHexNumStr != NULL)
	{
		delete[] pHexNumStr;
		pHexNumStr = NULL;
	}

	return true;
}

int main(int argc, char* argv[])
{
	const char* pszOctrl = "755";
	char szHexBuffer[10] = {0};

	if (ConvertOctalStrToHexStr(pszOctrl, szHexBuffer) == false)
	{
		printf("Convert false");
	}
	else
	{
		printf("%s\r\n", szHexBuffer);
	}

	return 0;
}

你可能感兴趣的:(8进制字符串转16进制字符串(一))