C读取二进制数并将其转换为Ascii码

C读取二进制数并将其转换为Ascii码,c,fread,C,Fread,我试图从文件中读取以下二进制文件(0110001),并将其转换为ascii码(97),但使用fread时,我得到了一个非常大的数字。 文件“c:/input.txt”仅包含以下行-0110001 数组值的printf打印大的数字,例如825241648 我的代码: int main() { unsigned int arr[8]; int cnt,i,temp=0; FILE * input; if(!(input=fopen("C:/input.txt","r"

我试图从文件中读取以下二进制文件(0110001),并将其转换为ascii码(97),但使用fread时,我得到了一个非常大的数字。 文件“c:/input.txt”仅包含以下行-0110001 数组值的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;
}
intmain()
{
无符号整数arr[8];
int cnt,i,温度=0;
文件*输入;
如果(!(input=fopen(“C:/input.txt”,“r”))
{
fprintf(stderr,“无法打开文件”\n);
出口(0);
}
cnt=fread(arr,1,8,输入);

对于(i=0;i您首先声明
无符号int-arr[8];
这意味着8个整数,或者更准确地说是8*4=32字节。在读取8个字节后,再次尝试输出8个整数。我想您想读取8个字节并将其作为数字输出?如果将type
int
更改为
char
,代码可能会工作。如果文件大小为32字节且包含整数,则可能需要更改fread()像这样:
fread(arr,sizeof(int),8,input);
arr
是一个整数数组。但是你只读取了8个字节。所以你的第一个整数会有一些大的值,第二个整数也会有一些大的值,但之后它们会有垃圾值。(你把
arr
变成了一个“自动的”变量,该变量在堆栈上分配,因此它将包含随机垃圾;如果将其设置为静态变量,它将被预初始化为零字节。)

如果将
arr
的声明更改为
char
类型,则可以读入字符串,而
for
循环将一次循环一个字节

然后,您可以将字符串写入二进制转换器,或者您可以使用
strtol()
进行转换,将基设置为2。
strtol()
并非在所有编译器中都可用;GCC可以,但Microsoft C没有。

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;
#包括
#包括
int main()
{
char-arr[8];
int cnt,i,温度=0;
文件*输入;
如果((输入=fopen(“数据”,“r”))==NULL)
{
fprintf(stderr,“无法打开文件”\n);
出口(1);
}
//读取大小为8的字符数组中的8字节
cnt=fread(arr,1,8,输入);
对于(i=0;iarr[i]=arr[i]使用累加器在字符串上循环以存储每个位置的转换数字。我尝试使用accumlator循环,但问题是数组的每个值都非常大,例如-825241648而不是1或0。将正在读取的数据项的大小与正在存储读取数据的变量的大小进行比较n检查您的代码。您是对的,如果我将其更改为char,它将按原样读取0和1的值。但是有没有办法将数组值从0110001转换为97?而不计算每个字节?
strtol
自早期ANSI C草稿以来一直是C标准的一部分。Microsoft还没有成功地在超过20年,这可能就是他们缺少该功能的原因。这里有一个bug。该代码将
char
变量移位,然后使用
temp
执行逻辑OR。这意味着如果二进制数超过8位,该代码将无法正常工作。只需将
temp
左移1位,然后然后在新的位中使用逻辑OR。