我的程序中有一点我想将二进制数转换为十六进制数,我遇到了很多麻烦。我正在将此数字转换为十六进制数,不带任何格式说明符,编码实际转换。
我已经从这个可汗学院教程的视频中手动研究了如何做到这一点:https://www.khanacademy.org/math/pre-algebra/applying-math-reasoning-topic/alternate-number-bases/v/binary-to-hexadecimal
我理解数学意义上的转换,但将其转换为代码会让我感到困惑。
到目前为止我所做的是函数调用。我已经有了一个整数类型的二进制文件。我需要将它发送到一个函数,该函数将返回其十六进制等效项。由于十六进制值可以用a-f,A-F字符表示,那么我不认为从函数返回一个整数是有效的。因此该函数必须返回包含转换后的十六进制值的char指针或char数组。这是我的函数调用计划:
char * hexAnswer;
hexAnswer = binaryToHex(answer) //answer is the binary number of type int
我遇到的问题是函数代码本身用于二进制到十六进制的转换。现在,我对转换的思考过程如下:
步骤1:将整数分段为4个组。 第2步:将4的二进制段转换为其十六进制等效值:
char * binaryToHex(int n)
{
//break into groups of 4
//send group of 4 to switch statement of equivalent hexadecimal conversion
//append the converted groups together
//Return hex number
}
这是switch语句:
char * IndividualBinToHex (/*The group of 4 binary digits*/) {
switch (/*group of 4 binary digits*/) {
case '0000':
return "0";
break;
case '0001':
return "1";
break;
case '00010':
return "2";
break;
case '0011':
return "3";
break;
case '0100':
return "4";
break;
case '0101':
return "5";
break;
case '0110':
return "6";
break;
case '0111':
return "7";
break;
case '1000':
return "8";
break;
case '1001':
return "9";
break;
case '1010':
return "A";
break;
case '1010':
return "a";
break;
case '1011':
return "B";
break;
case '1100':
return "C";
break;
case '1101':
return "D";
break;
case '1110':
return "E";
break;
case '1111':
return "F";
break;
}
}
我仍然对功能体将具体保留的内容感到困惑。感谢您提供任何帮助,我们可以发送。
答案 0 :(得分:1)
以下是基本想法:
int raw_input; // int to convert
// convert to unsigned to have defined shifting operations
unsigned int input=(unsigned int) raw_input;
static const char xlate[] = "0123456789ABCDEF";
static const int digits=2*sizeof (unsigned int);
char answer[3+digits];
answer [0]="0";
answer [1]="x";
int shift=4*digits;
for (int i = 0; i < digits; ++i)
{
shift-=4;
int nibble=(input >> shift) & 0xF;
answer [2+i]=xlate [nibble];
}
answer [2+digits]='\0';
只需移动半字节并将其屏蔽,然后使用查找表将其转换为字符。
答案 1 :(得分:-2)
这个解决方案取自Martin James&#39; (在评论中)。他的解决方案远远优于最初的答案。
#include <stdio.h>
const char* hexlat="0123456789ABCDEF";
char * binaryToHex(unsigned int answer, char * result)
{
if( answer == 0 ) return result;
else
{
// shift next nibble bits into rightmost nibble and recurse
result=binaryToHex( answer>>4, result );
// AND with last 4 bits, and get hex char to assign to current char
*result = hexlat[answer & 0x0F];
// return current char pointer + 1 to parent call
return result+1;
}
};
int main(void)
{
unsigned int answer = 0x12340ADF;
char hexAnswer[ 32 ];
// note the '\0' null terminates the end of the string
// since binaryToHex recursively returns the char index + 1
*binaryToHex( answer, hexAnswer ) = '\0';
printf( "%s", hexAnswer );
return 0;
}