c - 二进制文件读取,在c中添加额外的字符?

标签 c file file-io

<分区>

我尝试读取二进制(可执行)文件,但出现了一些问题,因为它每隔几个字节就会打印额外的字符 (0xffffff)。但是这段代码非常适合文本文件(非二进制)。代码是:

int main(int argc, char **argv) {
  uint64_t i=0;
  FILE * fp=fopen(argv[1],"rb");
  uint8_t a;
  long int size=0;
  char *msg;
  size=findSize(argv[1]);
  msg=(char *)malloc(size+1);

  while((a=fgetc(fp))!=EOF)
  {
    printf("%02x",a);
      msg[i]=(char)a;
    i++;
    if(i==size)
      break;
  }
  i=0;
  for(i=0;i<size;i++)
  {
    printf("%x",msg[i]);

  }
    return 0;
}

当我尝试打印 a 的值时,它完美地工作,而在打印 msg[i] 时,它会打印额外的字节 i,e:

原始字节: 0xa31c4b1ab66b900

带有额外字节的输出: 0xa31c4ffffffb1ffffffafffffffb66ffffffb900

最佳答案

char *msg;

您的msg 变量的数据类型为char,它可能已在您的平台上签名。也就是说,它表示从 -128 到 +127 的值。

printf("%x",msg[i]);

printf() 的任何参数的整数数据类型小于 int 的都将扩展为 int。该转换将保留算术值,因此 -128 即 char 中的 0x80,对于 int 将扩展为 0xFFFFFF80 >.

为避免这种情况,您需要先将值存储或转换为 unsigned charuint8_t 类型与 unsigned char 相同,更易于阅读,因此:

printf("%x", (uint8_t)msg[i]);

那样的话,数值的范围将在 0 到 255 之间,就像您期望的那样,并且即使在隐式转换为 int 之后也打印为 0x000xFF

关于c - 二进制文件读取,在c中添加额外的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57392220/

相关文章:

c - 使用c的文件中的行数

java - 为什么在 Linux 中抓取文件夹会随着每次迭代变得更快?

C程序从同一个文件中删除注释

c - 如何使用二元运算高效地执行 ==?

c - 如何将巨大的tlb(huge page)挂载为文件系统?

c - C 变量的内存地址

performance - 在 Perl 中更快地搜索文件

java - 根据哈希值确认文件内容

c - 按文件大小动态分配的数组太大

c - 将字符串的 ASCII 值写入文件 C