//写一个函数实现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;
}
8进制字符串转16进制字符串(二)
最新推荐文章于 2024-03-12 11:25:34 发布