【问题标题】:C fread binary number and convert it to Ascii codeC fread二进制数并将其转换为ASCII码
【发布时间】:2012-07-04 19:49:13
【问题描述】:

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

知道为什么吗?

【问题讨论】:

  • 使用累加器遍历字符串以存储每个地点的翻译数字。
  • 我尝试用累加器循环它,但问题是数组的每个值都非常大,例如 - 825241648 而不是 1 或 0。
  • 将您正在读取的数据项的大小与您存储读取的数据的变量的大小进行比较,然后查看您的代码。

标签: c fread


【解决方案1】:

arr 是一个整数数组。但是您只读取了 8 个字节。所以你的第一个整数会有一些大的值,你的第二个整数也会有,但在那之后它们会有垃圾值。 (您将arr 设为“自动”变量,该变量分配在堆栈上,因此其中会包含随机垃圾;如果您将其设为静态变量,则会将其预初始化为零字节。)

如果您将arr 的声明更改为char 类型,您可以读入您的字符串,您的for 循环将一次循环遍历这些字节。

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

【讨论】:

  • strtol 自早期的 ANSI C 草案以来一直是 C 标准的一部分。微软已经有 20 多年没有设法编写出严格符合标准的 C 编译器了,所以这可能就是他们缺乏该功能的原因。
【解决方案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;

}

【讨论】:

  • 这里有一个错误。这段代码移动了一个char 变量,然后与temp 进行逻辑或。这意味着如果二进制数长于 8 位,则此代码将无法正常工作。最好将temp 简单地左移 1 位,然后在新位中进行逻辑或。
【解决方案3】:

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

【讨论】:

  • 你是对的,如果我将其更改为 char,它会按原样读取 0 和 1 的值。但是有没有办法将数组值从 01100001 转换为 97?不计算每个字节?
猜你喜欢
  • 2016-10-02
  • 1970-01-01
  • 2014-03-24
  • 2014-08-16
  • 2019-12-03
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多