【问题标题】:How to convert hex value to binary value in C如何在C中将十六进制值转换为二进制值
【发布时间】:2014-10-19 20:36:41
【问题描述】:

谁能帮我修复我的代码。我有一个十六进制值的文本文件。现在我需要将十六进制值转换为二进制并打印出来。到目前为止,这是我的代码:

#include <stdio.h> 
#include <stdlib.h> 
#define MAX 1000 

int hex_to_binary(char *argv[]) 

int main(int argc,char *argv[]) 
{ 
    FILE *file; 
    file = fopen(argv[1],"r"); 
    char line[100]; 

    while(!feof(file)){ 
        fgets(line,100,file); 
        hex_to_binary(line); 
    } 
    fclose(file); 

    return 0; 
} 

int hex_to_binary(char *argv[]){ 
    char binaryNumber[MAX],hexaDecimal[MAX]; 
    long int i=0; 

    scanf(“%s”,argv[1]); 

    printf("\nEquivalent binary value: "); 
    while(hexaDecimal[i]){ 
         switch(hexaDecimal[i]){ 
             case '0': printf("0000"); break; 
             case '1': printf("0001"); break; 
             case '2': printf("0010"); break; 
             case '3': printf("0011"); break; 
             case '4': printf("0100"); break; 
             case '5': printf("0101"); break; 
             case '6': printf("0110"); break; 
             case '7': printf("0111"); break; 
             case '8': printf("1000"); break; 
             case '9': printf("1001"); break; 
             case 'A': printf("1010"); break; 
             case 'B': printf("1011"); break; 
             case 'C': printf("1100"); break; 
             case 'D': printf("1101"); break; 
             case 'E': printf("1110"); break; 
             case 'F': printf("1111"); break; 
             case 'a': printf("1010"); break; 
             case 'b': printf("1011"); break; 
             case 'c': printf("1100"); break; 
             case 'd': printf("1101"); break; 
             case 'e': printf("1110"); break; 
             case 'f': printf("1111"); break; 
             default:  printf("\nInvalid hexadecimal digit %c ",hexaDecimal[i]);                              return 0; 
     } 
     i++; 
} 

return 0; 

}

我不断收到以下错误:

part1_V2.c: In function ‘hex_to_binary’:
part1_V2.c:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
part1_V2.c:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’    token
part1_V2.c:26: error: stray ‘\342’ in program
part1_V2.c:26: error: stray ‘\200’ in program
part1_V2.c:26: error: stray ‘\234’ in program
part1_V2.c:26: error: stray ‘\342’ in program
part1_V2.c:26: error: stray ‘\200’ in program
part1_V2.c:26: error: stray ‘\235’ in program
part1_V2.c:59: error: expected ‘{’ at end of input

提前致谢!

好的,谢谢你们的帮助,我的代码可以正常工作,但现在输出有问题:

我传递给主函数的文本文件包含:

“1283”(第 1 行) “5105”(下一行)

这些是文件上的十六进制值。所以当我运行程序时,我会得到输出:

等效二进制值:0001001010000011 无效的十六进制数字 十六进制数字无效
等效二进制值:0101000100000101

我想知道为什么我得到无效的十六进制数字输出?是不是因为它试图将“\n”或空白空间转换为二进制?

【问题讨论】:

  • 真的吗?编译?
  • 在第 5 行末尾添加一个; 怎么样?
  • 好奇,什么/谁建议使用feof(file) 来确定EOF?
  • int hex_to_binary(char *argv[]) --> int hex_to_binary(char *line);
  • scanf(“%s”,argv[1]); 删除此行。

标签: c binary hex


【解决方案1】:

您的代码中似乎有几个非 ascii 字符,例如,应该是 。 剩下的是语法和类型错误。

【讨论】:

    【解决方案2】:

    您的代码中有一些语法错误。试试这个修改后的代码。如果您将正确的参数传递给 main(),那么它应该可以工作:

    #include <stdio.h>
    
    int hex_to_binary(char*);
    
    int main(int argc, char *argv[])
    {
        FILE *file;
        file = fopen(argv[1],"r");
        char line[100];
    
        while(!feof(file)){
            fgets(line,100,file);
            hex_to_binary(line);
        }
        fclose(file);
        getchar();
        return 0;
    }
    
    int hex_to_binary(char* hex_string)
    {
        int i=0;
        printf("\nEquivalent binary value: ");
        while(hex_string[i])
        {
             switch(hex_string[i])
             {
                 case '0': printf("0000"); break;
                 case '1': printf("0001"); break;
                 case '2': printf("0010"); break;
                 case '3': printf("0011"); break;
                 case '4': printf("0100"); break;
                 case '5': printf("0101"); break;
                 case '6': printf("0110"); break;
                 case '7': printf("0111"); break;
                 case '8': printf("1000"); break;
                 case '9': printf("1001"); break;
                 case 'A': printf("1010"); break;
                 case 'B': printf("1011"); break;
                 case 'C': printf("1100"); break;
                 case 'D': printf("1101"); break;
                 case 'E': printf("1110"); break;
                 case 'F': printf("1111"); break;
                 case 'a': printf("1010"); break;
                 case 'b': printf("1011"); break;
                 case 'c': printf("1100"); break;
                 case 'd': printf("1101"); break;
                 case 'e': printf("1110"); break;
                 case 'f': printf("1111"); break;
                 default:  printf("\nInvalid hexadecimal digit %c ", hex_string[i]);
            }
            i++;
        }
        return 0;
    }
    

    【讨论】:

    • 谢谢。现在我遇到了输出问题。我传递给主函数的纺织品包含:1283,然后是下一行:5105。这些是文件上的十六进制值。所以当我运行程序时,我得到输出: 等效二进制值:0001001010000011 无效十六进制数字 无效十六进制数字 等效二进制值:0101000100000101 我想知道为什么我得到无效的十六进制数字输出?是因为它试图将“\n”或空白空间转换为二进制吗?
    • 只是想回答你关于“\n”的问题。我也这么认为。
    【解决方案3】:

    你的第一个小错误是在第 5 行的函数定义处。在末尾添加一个分号:

    int hex_to_binary(char *argv[]);

    同样没有用,所以删除该行:

    scanf(“%s”,argv[1]);

    并重写while循环:

    while(hexaDecimal[i]!='\n' && hexaDecimal[i]!='\0')
    {
      switch(hexaDecimal[i])
      {
         ...
      }
      i++;
    }
    

    注意i++ 在循环中。加上末尾的return 0 语句在任何函数之外。搬进去。

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      如 cmets 中所述,您在第 5 行缺少;

      缺少; 可能会导致一连串错误,因为编译器正在寻找结束语句的内容(; 并未结束该语句)。

      我要进入教师模式,所以如果我觉得我居高临下,我提前道歉。


      考虑到这一点,尝试依次修复每个错误。错误消息看起来总是很技术性,但是如果您停下来阅读它,它会提供很多信息。

      因此,对于您的第一个错误,在第 8 行,它表明它期待的是 {。由于这是main函数的开始,所以第7-8行的内容是正确的,所以错误一定是在之前这两行。

      在你的 main 函数之前是一个函数原型,它...aha...缺少分号

      关于 stray \xxx in program 的错误,这可能是因为您从 word 文档或网站复制了 scanf("%s", argv[1]) 行,并且复制了一对格式化的引号。

      要修复,只需删除引号并手动输入。

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2017-03-19
        • 2011-08-04
        相关资源
        最近更新 更多