将十六进制转换为二进制然后转换为十进制

时间:2014-10-20 05:14:25

标签: c arrays binary hex decimal

我的代码(下面)采用十六进制值的文本文件,并将十六进制值转换为二进制,然后转换为十进制。然后我只想通过在main函数中添加printf语句来打印输出。但我无法弄清楚为什么我的main函数中的printf语句是错误的?提前致谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int hex_to_binary(char *hex_string, char *binary_line);
int bstr_to_dec(const char * str);

int main()
{
    FILE *file;;
    file = fopen("obj.txt","r");
    char line[200];
    char binary_line[20];

    while(!feof(file)){
        fgets(line,100,file);
        //hex_to_binary(line,binary_line);
        //printf("%s\n", binary_line);
        printf("%d\n",bstr_to_dec((hex_to_binary(line,binary_line))); //This line is having errors
        memset(binary_line,0,20);
    }
    fclose(file);
    getchar();
    return 0;
}

int hex_to_binary(char *hex_string, char *binary_line)
{
    int i=0;
    while(hex_string[i])
     {
        switch(hex_string[i])
        {
            case '0': strcat(binary_line,"0000"); break;
            case '1': strcat(binary_line,"0001"); break;
            case '2': strcat(binary_line,"0010"); break;
            case '3': strcat(binary_line,"0011"); break;
            case '4': strcat(binary_line,"0100"); break;
            case '5': strcat(binary_line,"0101"); break;
            case '6': strcat(binary_line,"0110"); break;
            case '7': strcat(binary_line,"0111"); break;
            case '8': strcat(binary_line,"1000"); break;
            case '9': strcat(binary_line,"1001"); break;
            case 'A': strcat(binary_line,"1010"); break;
            case 'B': strcat(binary_line,"1011"); break;
            case 'C': strcat(binary_line,"1100"); break;
            case 'D': strcat(binary_line,"1101"); break;
            case 'E': strcat(binary_line,"1110"); break;
            case 'F': strcat(binary_line,"1111"); break;
            case 'a': strcat(binary_line,"1010"); break;
            case 'b': strcat(binary_line,"1011"); break;
            case 'c': strcat(binary_line,"1100"); break;
            case 'd': strcat(binary_line,"1101"); break;
            case 'e': strcat(binary_line,"1110"); break;
            case 'f': strcat(binary_line,"1111"); break;
            case ' ':break;
            case '\n':break;
        }
        i++;
    }
    printf("%d\n",bstr_to_dec(binary_line));
    return 0;
}

int bstr_to_dec(const char * str) 
{
    int val = 0;     
    while (*str != '\0')
    {
        val = 2 * val + (*str++ - '0');
    }
    return val;
}

我收到此错误

warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
            printf("%d\n",bstr_to_dec((hex_to_binary(line,binary_line))); 

3 个答案:

答案 0 :(得分:0)

您只为binary_line分配了20个字符

char binary_line[20];

但最终输出的总长度可能远远超过20个字符。如果十六进制输入超过5个十六进制字符,则将覆盖为binary_line分配的内存。

每个十六进制字符将产生4个二进制数字。

答案 1 :(得分:0)

首先,你有4个开放式括号&#39;(&#39;,只有3个小括号&#39;)&#39;在printf线上。

然后我们发现hex_to_binary(...)返回一个int,但是bstr_to_dec(...)期望一个字符串参数。

要将hex_to_binary(...)用作bstr_to_dec(...)的参数,需要返回一个字符串。

目前,该函数修改了传入的binary_line []的内容,但在函数完成后您不会使用该内容。看起来你打算返回字符串,而是返回一个硬编码为0的int值。

提示:

char *hex_to_binary(char *hex_string)
char binary_line[200];
...
return binary_line;

答案 2 :(得分:0)

你错误地使用了&#39; hex_in_binary&#39;功能

hex_in_binary(char * hex_string,char * binary_line)始终返回0,并修改binary_line的值。

您不使用hex_in_binary的返回值作为bstr_to_dec的第一个参数,而是使用binary_line作为第一个参数。

在您的代码中,按照

行开头
    printf("%d\n",bstr_to_dec((hex_to_binary(line,binary_line))); //This line is having errors

按照以下说明纠正

    hex_to_binary(line,binary_line);
    printf("%d\n",bstr_to_dec(binary_line));

您可能需要更正Eric J提到的binary_line []的大小。

binary_line的大小应该大于您使用的文本文件的一行中乘以4的最大十六进制字符数。