Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将0和1个字符的字符串转换为十六进制字符串_C - Fatal编程技术网

C 将0和1个字符的字符串转换为十六进制字符串

C 将0和1个字符的字符串转换为十六进制字符串,c,C,我正在将文件中存储的所有二进制数转换为十六进制。该文件通过命令行参数解析,但要将其转换为十六进制,我希望将其转换为整数,即接收到的字符串的文本整数,并且atoi()似乎不起作用 #include<stdlib.h> #include<stdio.h> #include<string.h> int main ( int argc, char *argv[] ) { FILE *fp,*op; fp = fopen(argv[1],"r");

我正在将文件中存储的所有二进制数转换为十六进制。该文件通过命令行参数解析,但要将其转换为十六进制,我希望将其转换为整数,即接收到的字符串的文本整数,并且
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;
}
输出文件应包含:

000a
a000
abcdef
123456
111111
777777
000000

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

您需要使用
strtoul
函数进行转换,并为输入指定基数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);

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

您可以动态转换内容,一次转换一个字节,并将任何非二进制数字不加更改地传递到输出:

#包括
#包括
#包括
int main(int argc,char*argv[]){
文件*fp,*op;
int c,hasnum;
无符号长数;
如果(argc<3
||((fp=fopen(argv[1],“r”))==NULL
||((op=fopen(argv[2],“w”)==NULL){
perror(“打开文件时出错”);
返回1;
}
hasnum=0;
num=0;
对于(;;){
c=getc(fp);
如果(c='0'| | c=='1'){
num=num*2+(c-“0”);
hasnum++;
}否则{
if(hasnum){
//为4个输入二进制数字输出一个十六进制数字
fprintf(fo,“%0*x”,(hasnum+3)/4,num);
hasnum=0;
num=0;
}
如果(c==EOF)
打破
}
}
fclose(fp);
fclose(op);
返回0;
}

输入文件的内容是什么?输出文件中有什么,它应该包含什么?输入文件包含多个二进制数,每个二进制数在不同的行中,输出文件应该包含十六进制数。我应该能够很好地进行转换,但我无法将字符串转换为数字操作的等效文本整数。D如果不描述输入/输出,请显示它。输入文件包含000000000000 1010 1010000000000000 101010111100110111101111 000100101001000101000010110 000100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100100000000@rohithp你能把输出文件的内容放到您的问题就在代码下面?对于输入“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”无效^~~~