没有格式说明符,在C中将二进制int数转换为十六进制

时间:2015-07-05 23:19:25

标签: c function binary hex

我的程序中有一点我想将二进制数转换为十六进制数,我遇到了很多麻烦。我正在将此数字转换为十六进制数,不带任何格式说明符,编码实际转换。

我已经从这个可汗学院教程的视频中手动研究了如何做到这一点: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;
     }
   }

我仍然对功能体将具体保留的内容感到困惑。感谢您提供任何帮助,我们可以发送。

2 个答案:

答案 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; 
}