现在的位置: 首页 > 综合 > 正文

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

2018年02月08日 ⁄ 综合 ⁄ 共 2984字 ⁄ 字号 评论关闭
//写一个函数实现8进制字符串到16进制字符串的转换
//例如:
//输入"755"结果是"1ED"
//输入"777777777777"结果是"FFFFFFFFF" (注意超过了32位)

//答案2
//使用位段定义
#include <iostream.h>
#include <string.h>

struct tagDataForOctal
{
	unsigned int n3Bit1:3;   //表示一位8进制数
	unsigned int n3Bit2:3; 
	unsigned int n3Bit3:3; 
	unsigned int n3Bit4:3; 
};

struct tagDataForHex
{
	unsigned int n4Bit1:4;   //表示一位16进制数
	unsigned int n4Bit2:4;
	unsigned int n4Bit3:4;
};

//8进制字符串转16进制字符串
//注:要保证pHexStr指向内存空间的长度
bool ConvertOctalStrToHexStr(const char* pOctalStr, char* pHexStr)
{
	//检查
	if (pOctalStr == NULL || pHexStr == NULL)
	{
		return false;
	}
	
	int nCount = 0;
	//获取8进制字符串的长度
	int nLength = strlen(pOctalStr);
	if (nLength % 4 == 0)
	{
		nCount = nLength/4;
	}
	else
	{
		nCount = nLength/4 + 1;
	}
	
	//申请内存空间
	char* pszOctalBuffer = new char[nCount*4];
	if (pszOctalBuffer == NULL)
	{
		return false;
	}
	memset(pszOctalBuffer, 0, nCount*4);

	//755 -> 5570
	for (int i = 0; i < nLength; i++)
	{
		pszOctalBuffer[i] = pOctalStr[nLength - 1 -i];
	}

	char* pszHexBuffer = new char[nCount*3];
	if (pszHexBuffer == NULL)
	{
		return false;
	}
	memset(pszHexBuffer, 0, nCount*3);

	int nIndex = 0;
	tagDataForOctal DataForOctal;
	tagDataForHex*   pDataForHex = NULL;
	for (i = 0; i < nCount*4; i+=4)
	{
		//清零
		DataForOctal.n3Bit1 = 0;
		DataForOctal.n3Bit2 = 0;
		DataForOctal.n3Bit3 = 0;
		DataForOctal.n3Bit4 = 0;

		//给DataForOctal结构体赋值
		if (pszOctalBuffer[i] != 0 && pszOctalBuffer[i] < '0' || pszOctalBuffer[i] > '7')
		{
			return false;
		}
		else if (pszOctalBuffer[i] != 0)
		{
			DataForOctal.n3Bit1 = pszOctalBuffer[i] - 48;
		}

		if (pszOctalBuffer[i+1] != 0 && pszOctalBuffer[i+1] < '0' || pszOctalBuffer[i+1] > '7')
		{
			return false;
		}
		else if (pszOctalBuffer[i+1] != 0)
		{
			DataForOctal.n3Bit2 = pszOctalBuffer[i+1] - 48;
		}

		if (pszOctalBuffer[i+2] != 0 && pszOctalBuffer[i+2] < '0' || pszOctalBuffer[i+2] > '7')
		{
			return false;
		}
		else if (pszOctalBuffer[i+2] != 0)
		{
			DataForOctal.n3Bit3 = pszOctalBuffer[i+2] - 48;
		}

		if (pszOctalBuffer[i+3] != 0 && pszOctalBuffer[i+3] < '0' || pszOctalBuffer[i+3] > '7')
		{
			return false;
		}
		else if (pszOctalBuffer[i+3] != 0 )
		{
			DataForOctal.n3Bit4 = pszOctalBuffer[i+3] - 48;
		}

		//指针类型的转换
		pDataForHex = (tagDataForHex*)&DataForOctal;
	
		nIndex = i/4;
		if (pDataForHex->n4Bit1 >= 0 && pDataForHex->n4Bit1 <= 9)
		{
			pszHexBuffer[nIndex*3] = pDataForHex->n4Bit1 + 48; 
		}
		else if (pDataForHex->n4Bit1 >= 10 && pDataForHex->n4Bit1 <= 15)
		{
			pszHexBuffer[nIndex*3] = pDataForHex->n4Bit1 + 55;
		}
		
		if (pDataForHex->n4Bit2 >= 0 && pDataForHex->n4Bit2 <= 9)
		{
			pszHexBuffer[nIndex*3+1] = pDataForHex->n4Bit2 + 48; 
		}
		else if (pDataForHex->n4Bit2 >= 10 && pDataForHex->n4Bit2 <= 15)
		{
			pszHexBuffer[nIndex*3+1] = pDataForHex->n4Bit2 + 55;
		}

		if (pDataForHex->n4Bit3 >= 0 && pDataForHex->n4Bit3 <= 9)
		{
			pszHexBuffer[nIndex*3+2] = pDataForHex->n4Bit3 + 48; 
		}
		else if (pDataForHex->n4Bit3 >= 10 && pDataForHex->n4Bit3 <= 15)
		{
			pszHexBuffer[nIndex*3+2] = pDataForHex->n4Bit3 + 55;
		}

	}

	//转换
	for (int j = 0; j < nCount*3; j++)
	{
		pHexStr[j] =  pszHexBuffer[nCount*3 -1 - j];
	}

	//没考虑16进制字符串最高位为0的情况 340 ->0E0  0得去掉

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

	if (pszHexBuffer != NULL)
	{
		delete[] pszHexBuffer;
		pszHexBuffer = NULL;
	}

	return true;
}


int main(int argc, char* argv[])
{
	char *pszOCtrl = "340";   //结果 E0
	//char *pszOCtrl = "555";
	//char *pszOCtrl = "755";
	//char *pszOCtrl = "777777777777";
	char szHexBuffer[12] = {0};

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

	return 0;
}

抱歉!评论已关闭.