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或十六进制值以便比较和修改十六进制或二进制值。我如何阅读在这里打开的程序的十六进制/二进制值?
答案 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字节类型。然后将其打印为十六进制值。