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”无效^~~~