C fread二进制数并将其转换为Ascii代码

我正在尝试从文件中读取以下二进制文件(01100001)并将其转换为ascii代码(97),但是当使用fread时,我得到了一个非常大的数字。 文件“c:/input.txt”只包含以下行-01100001 printf的数组值打印大数字,如825241648

我的代码:

int main() { unsigned int arr[8]; int cnt,i,temp=0; FILE * input; if(!(input=fopen("C:/input.txt","r"))) { fprintf(stderr,"cannot open file\n"); exit(0); } cnt = fread(arr,1,8,input); for(i=0;i<cnt;i++) { printf("%d\n",arr[i]); } return 0; } 

知道为什么吗?

arr是一个整数数组。 但是你只读了8个字节。 因此,您的第一个整数将具有一些较大的值,您的第二个也将如此,但之后它们将具有垃圾值。 (你使arr成为一个“自动”变量,它在堆栈上分配,因此它会有随机垃圾;如果你把它变成静态变量,它会被预先初始化为零字节。)

如果你更改了arr的声明,使它的类型为char ,你可以读取你的字符串,你的for循环将一次循环这些字节。

然后你可以编写一个字符串到二进制的翻译器,或者你可以使用strtol()来进行基本设置为2的转换strtol()在所有编译器中都不可用; 海湾合作委员会很好,但微软C没有它。

PL。 看看下面的代码(在Linux上使用gcc编译)是否适用于此。

 #include #include int main() { char arr[8]; int cnt,i,temp=0; FILE * input; if((input=fopen("data","r"))==NULL) { fprintf(stderr,"cannot open file\n"); exit(1); } //Read the 8 bytes in a character array of size 8 cnt = fread(arr,1,8,input); for (i = 0; i < cnt; i++) { //Now change it to 0/1 form by substracting 48 arr[i] = arr[i] - '0';/* Ascii of 0 = 48*/ //Also Left shift.. arr[i] = arr[i] << (cnt - (i+1)); //Now Bit wise OR with the integer... temp = temp | arr[i]; } printf("The ascii value is %d and the character is %c\n", temp, temp); return 0; 

}

你首先声明unsigned int arr[8]; 这意味着8个整数或更准确地说是8 * 4 = 32个字节。 之后,您读取8个字节,然后再次尝试输出8个整数。 我想你想读取8个字节并将它们作为数字输出? 如果将int类型更改为char ,则代码可能有效。 如果文件大小为32个字节并包含整数,您可能需要更改fread(),如下所示: fread(arr,sizeof(int),8,input);