二进制I / O,查找要在文件中修改的特定字节

时间:2014-11-06 20:52:04

标签: c

int main()
{

 long int length = 0; /*file byte length*/
 int index;
 FILE *myFile;

     myFile = fopen("test file", "r+b");

 if(!myFile)
 {
   printf("Error, unable to open file");
   return 1;
 }
 else
 {
   /*Lets find the total bytes in the file*/
   fseek(myFile, 0, SEEK_END); /*Seeks end for length*/
   length = ftell(myFile);
   fseek(myFile,0, SEEK_SET); /*seeks beginning for reset*/
   printf("Total file bytes is %d\n",length);
   unsigned char buffer[32]; /*reading into buffer 4 bytes, 32 bits*/
   size_t bytes_read = 0;

   for(index = 0; index < 30; index++) /*30 is just a testing value*/
    {
     bytes_read = fread(&buffer,4,1,myFile); /*Read 4 bytes at a time*/

    printf("Bytes read: %i", bytes_read);
    printf("%s\n",buffer);
   }

}




  fclose(myFile);
   return 0;
}

在我继续之前,是的,这不是一个有效的程序,会产生很多开销......

我一次从文件中读取4个字节,但是,不明白如何读取实际的二进制0和1或十六进制值以便比较和修改十六进制或二进制值。我如何阅读在这里打开的程序的十六进制/二进制值?

2 个答案:

答案 0 :(得分:0)

你的缓冲区大32字节;数组参数根据单位设置大小。在大多数系统中,unsigned char为1字节(8位),因此缓冲区的大小为8 * 32位。

按照目前的情况,缓冲区包含4个字节的文件,然后是28个空字节。

你可以对前4个字节进行操作,就像在数组中的任何值一样,ex

if (0x2 == buffer[0])
{
    printf("I found a 2 in hex!");
}

答案 1 :(得分:0)

如果要将二进制文件打印中的值视为十六进制字节,请尝试以下操作:

将缓冲区声明更改为:

uint32_t buffer;

和你的printf:

printf("0x%0X\n", buffer);

使用uint32_t类型将使您的fread与您的缓冲区保持一致,在这些机器上,int可能不是32位。要使用它,您可能需要

#include <stdint.h>

使用你的fread,这将从你的文件读取4个字节到4字节类型。然后将其打印为十六进制值。