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

时间:2012-07-04 10:05:03

标签: c fread

我正在尝试从文件中读取以下二进制文件(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;
}

任何想法为什么?

3 个答案:

答案 0 :(得分:3)

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

如果您更改arr的声明以使其类型为char,则可以读取您的字符串,并且您的for循环将一次循环一个字节

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

答案 1 :(得分:2)

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

#include<stdio.h>
#include<stdlib.h>
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;

}

答案 2 :(得分:1)

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