zoukankan      html  css  js  c++  java
  • 8进制字符串转16进制字符串(二)

    //写一个函数实现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
    ", szHexBuffer);
    	}
    
    	return 0;
    }

  • 相关阅读:
    完美主义之我见
    职场-位置思维
    我的读书观
    人力资源是组织的第一战略资源-论基层员工
    积累是做成事情得唯一途径
    地理信息数据处理之我见
    word 之 插入删除空行
    OSMeteorTranslationAPI(百度,有道)对比
    CsharpOSMeteorCodeGenerator(Metero代码生成器)
    HtmlDOM 文档读取研究
  • 原文地址:https://www.cnblogs.com/csnd/p/11800749.html
Copyright © 2011-2022 走看看