C将二进制数转换为十六进制的程序如果等于十六进制字母,则不能转换两个以上的二进制数

时间:2014-11-02 23:31:18

标签: c

例如,如果我键入101010101010,它应该等于AAA,但它不起作用。如果一次少于两个字母,它只返回字母。例如,如果我输入“10101010”,它就有效。 (它返回AA)。请帮帮忙?

#include <stdio.h>
#include <math.h>
#include <string.h>
void binary_hex(int n, char hex[]);
int hex_binary(char hex[]);

int main()
{
    printf("Enter binary number: ");
    scanf("%d",&n);
    binary_hex(n,hex);
    printf("Hexadecimal number: %s",hex);
}

void binary_hex(int n, char hex[]) /* Function to convert binary to hexadecimal. */
{
    int i=0,decimal=0, rem;
    while (n!=0)
    {
        decimal += (n%10)*pow(2,i);
        n/=10;
        ++i;
    }

/* At this point, variable decimal contains binary number in decimal format. */
    i=0;
    while (decimal!=0)
    {
        rem=decimal%16;
        switch(rem)
        {
            case 10:
              hex[i]='A';
              break;
            case 11:
              hex[i]='B';
              break;
            case 12:
              hex[i]='C';
              break;
            case 13:
              hex[i]='D';
              break;
            case 14:
              hex[i]='E';
              break;
            case 15:
              hex[i]='F';
              break;
            default:
              hex[i]=rem+'0';
              break;
        }
        ++i;
        decimal/=16;
    }
    hex[i]='\0';
    strrev(hex);       /* Function to reverse string. */
}

2 个答案:

答案 0 :(得分:2)

您没有展示完整的程序 - n未在main的任何范围内声明。假设int n,您的第一个问题就在这里:

printf("Enter binary number: ");
scanf("%d",&n);

您正在读取1和0的字符串作为基数10(十进制)整数。相反,你应该编写一个函数,它接受const char *并迭代每个字符,验证它是1还是0,解释每个字符的值,并累计总数。提示:按从右到左的顺序工作可能更容易。

int parse_binary(const char *str)
{
    int total = 0;

    while (...) {
       total += ...
    }

    return total;
}

另一个提示:不要重新发明轮子。当然,有人想在你之前解析C中的二进制数,不是吗?查看strtoul - 即其第三个参数的说明。

注意:到目前为止我提到的两件事都将二进制值限制为32位(或64位,具体取决于您的数据类型选择)。如果您不需要实际使用整数值,则只需将1s和0s的字符串转换为十六进制值(任意长度)的字符串,然后就可以将问题分解为更简单的步骤。

我们真正喜欢使用十六进制的原因是十六进制值中的每个字符恰好代表一个半字节,它恰好是四位。这意味着每组四个1或0对应于一个十六进制字符。假设您的输入总是长度为4个字符的倍数,您可以轻松处理任意长的字符串。

D    E    A    D    B    E    E    F
1101 1110 1010 1101 1011 1110 1110 1111

答案 1 :(得分:0)

一个非常适合初学者的解决方案。这适用于大二进制数/字符串。

#include <stdio.h>
#include <string.h>
int main()
{
    int hexConstant[] = {0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111};

    char hex[20000];
    char binary[20000];
    int index, i, digit;

    printf("Enter binary string: ");
    scanf("%s", binary);

    index = 0;
    int len = strlen(binary) ;
    for(int j =  len-1; j>=0; j-=4) {

         if(j-3>=0) digit = (binary[j-3]-'0')*1000 + (binary[j-2]-'0')*100 + (binary[j-1]-'0') * 10 + (binary[j]-'0');
         else if(j-3>=0) digit = (binary[j-2]-'0')*100 + (binary[j-1]-'0') * 10 + (binary[j]-'0');
         else if(j-1>=0) digit = (binary[j-1]-'0') * 10 + (binary[j]-'0');
         else digit = (binary[j]-'0');

         for(i=0; i<16; i++)
        {
            if(hexConstant[i] == digit)
            {
                if(i<10)
                {
                    hex[index] = (char)(i + 48);
                }
                else
                {
                    hex[index] = (char)((i-10) + 65);
                }

                index++;
                break;
            }
        }
    }

    hex[index] = '\0';

    strrev(hex);

    printf("Hexadecimal number = %s", hex);

    return 0;
}