//写一个函数实现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; }