【问题标题】:Converting string of 0 and 1 characters to hexadecimal string将0和1字符的字符串转换为十六进制字符串
【发布时间】:2020-02-14 20:27:52
【问题描述】:

我正在将文件中存储的所有二进制数转换为十六进制。该文件通过命令行参数进行解析,但要将其转换为十六进制,我希望将其转换为整数,即接收到的字符串的文字整数,atoi() 似乎不起作用。

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

int main ( int argc, char *argv[] )
{
    FILE *fp,*op;
    fp = fopen(argv[1],"r");
    op= fopen(argv[2],"w+");
    if( fp == NULL) 
    {
       perror("An error has occurred\n");
       exit(1);
    }

    char buff[1026];
    unsigned char hexstr[1024];
    unsigned long int hexnum,hexint;
    unsigned char four[4];
    int i, j,len;
    while(fgets(buff, sizeof(buff), fp))
    {
        printf("\nString value = %s", buff);
        hexint=atoi(buff);
        printf("%ld",hexint);
    }

    fclose(fp); 
    fclose(op);
    return 0;
}

输入文件包含:

0000000000001010
1010000000000000
101010111100110111101111
000100100011010001010110
000100010001000100010001
011101110111011101110111
000000000000000000000000

输出文件应包含:

000a
a000
abcdef
123456
111111
777777
000000

【问题讨论】:

  • 输入文件的内容是什么?输出文件中有什么,应该包含什么?
  • 输入文件包含多个二进制数,每个都在不同的行中,输出文件应该包含十六进制我应该很好地进行转换,但我无法将字符串转换为其文字整数等价于数字操作。
  • 不要描述输入/输出,显示它
  • Input file contains 0000000000001010 1010000000000000 101010111100110111101111 000100100011010001010110 000100010001000100010001 011101110111011101110111 000000000000000000000000 o/p file should contain: 000a a000 abcdef 123456 111111 777777 000000
  • @rohithp 你能把输出文件的内容放在代码下面吗?

标签: c


【解决方案1】:

atoi 函数要求输入文本为十进制格式,但您输入的是二进制格式。此外,您正在使用%d 格式说明符进行打印,它输出十进制格式。

您需要改用strtoul 函数进行转换,并为输入指定base 2。然后对于输出,使用%x 格式说明符以十六进制打印。

while(fgets(buff, sizeof(buff), fp))
{      printf("\nString value = %s", buff);
       hexint=strtoul(buff, NULL, 2);
       printf("%lx",hexint);
}

如果您希望打印的位数根据输入文本的长度而变化,您可以指定字段宽度 * 并将位数作为额外参数传递,并添加 0用零填充左侧的标志。

由于你有二进制字符串,并且有 4 个二进制数字到 1 个十六进制数字,将二进制字符串的长度除以 4 并向上取整得到位数:

       hexint=strtoul(buff, NULL, 2);
       int bindigits = strlen(buff);
       int hexdigits = (bindigits % 4 == 0) ? bindigits / 4 : bindigits / 4 + 1;
       printf("%0*lx", hexdigits, hexint);

【讨论】:

  • 对于输入“0000000000001010”,它给了我输出“a”,但预期的输出是“000a”
  • @rohithp 如果要打印至少 4 位数字,请将字段宽度设置为 4 并使用 0 标志指定左填充零,即%04lx
  • 这适用于打印,但是当我想将它写回输出文件时,它不会,无论是使用 fprintf 还是使用 fputs 并且它不是特定于 4 位数字,它是通用的(对于用户在输入文件中输入了多少位数字)。
  • printf 系列的格式说明符是相同的,所以它应该适用于 fprintf。 fputs 没有收到格式字符串,所以在这种情况下你不能使用它
  • 进行这些更改后,它给了我以下错误。在函数“main”中:3.c:22:20:错误:“%”标记之前的预期表达式 fprintf(op,%04lx); ^ 3.c:22:21: 错误:整数常量 fprintf(op,%04lx) 上的后缀“lx”无效; ^~~~
【解决方案2】:

对于这个转换分配,如果行长可以是任意的,使用fgets() 可能会造成问题。

您可以即时转换内容,一次一个字节,并将任何非二进制数字原封不动地传递给输出:

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

int main(int argc, char *argv[]) {
    FILE *fp, *op;
    int c, hasnum;
    unsigned long long num;

    if (argc < 3
    ||  ((fp = fopen(argv[1], "r")) == NULL
    ||  ((op = fopen(argv[2], "w")) == NULL) {
       perror("Error opening files\n");
       return 1;
    }
    hasnum = 0;
    num = 0;

    for (;;) {
        c = getc(fp);
        if (c == '0' || c == '1') {
            num = num * 2 + (c - '0');
            hasnum++;
        } else {
            if (hasnum) {
                // output one hex digit for 4 input binary digits
                fprintf(fo, "%0*x", (hasnum + 3) / 4, num);
                hasnum = 0;
                num = 0;
            }
            if (c == EOF)
                break;
        }
    }
    fclose(fp); 
    fclose(op);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2020-11-07
    • 2013-02-07
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多