繁体   English   中英

读取二进制文件到 -32767 到 32767 的整数范围

[英]Read binary file to integer range of -32767 to 32767

我需要编写一个程序,将二进制文件读入-32767到32767的范围内,到目前为止,下面的脚本将二进制文件读入了-128到127的范围。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *fp = NULL;
  signed char shint[2000] = "";
  int i = 0;
  size_t  bytes = 0;

  if ((fp = fopen("raw_data.ht3", "rb")) == NULL) {
    printf ("could not open file\n");
    return 0;
  }
  if ((bytes = fread(&shint, 1, 2000, fp)) > 0 ) {  //bytes more than 0
    for (i = 0; i < bytes; i++) {
      printf ("%d\n", shint[i]);
    }
  }
  fclose(fp);
  return 0;
}

关于二进制文件的更多信息,我的讲师说应该将二进制文件读入 4 字节数据(我不确定我的措辞是否正确)。 数据非常大,所以我停止读取数据,直到 2000 个数据。 虽然将来我需要阅读所有这些。

最终数据表示

这就是我想在一天结束时绘制的方式。 得到想要的数据后,我会调用我们的 matlab 或 scilab。

谢谢!

对输入数据使用4字节表示,即替换

signed char shint[2000] = "";

long int shint[2000] = "";

 if ((bytes = fread(&shint, 1, 2000, fp)) > 0 ) {  //bytes more than 0

 if ((bytes = fread(&shint, 4, 2000, fp)) > 0 ) {  //bytes more than 0

printf ("%d\n", shint[i]);

printf ("%ld\n", shint[i]);

笔记:

根据您的变量名称( shint ,即short int )以及-32768+32767的范围,您的讲师似乎想要2个字节的数字,而不是4
在这种情况下,在声明中使用short int (或简称为short )并将2作为fread()函数的第二个参数。

我没有你的数据来测试(我没有测试我的答案)但它应该是这样的:

首先signed char shint[2000] = ""; 持有 2000 个有符号字符(它们确实是有符号的 8 位值,请看这里- 这是处理数据类型大小时非常方便的资源),因此您需要一些值来保存有符号的 32 位(4 字节)值,这取决于您的机器架构,假设它是 32 位整数( 不难找出),您可以将值保存在int shint[2000] = "";

接下来你需要注意的是函数fread这里是一些友好的文档,这个函数的第二个参数(在你的代码中是 1)应该是字节数,代表你想要读取的数据中的单个值,所以在你的情况下应该是 4(字节)。 其他参数应该没问题。

编辑:为了确保您正在阅读 4 个字节,您确实可以使用 MarianD 给出的答案并存储long值。

据我了解,您希望轻松访问字符和带符号的 16 位整数。

#define SIZE 2000

union
{
    char shint_c[SIZE * 2];
    short shint[SIZE];
}su;

然后在你的 if

fread(&su, 2, SIZE, fp)

并在循环中打印短裤

printf ("%hd\n", su.shint[i]);

或 8 位整数

printf ("%hhd\n", su.shint_c[i]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM