在 C 中二进制读取和写入文件
Binary Reading from and Writing to a File in C
我需要一些帮助,用 C 语言编写一个程序来从文件读取二进制值和向文件写入二进制值。对于这个程序,我不需要读入文件的全部内容(2048 字节),只需要读入前 30 个半字。
我确实知道如何编写一个程序来为文本文件执行此操作,但我不熟悉二进制文件。我需要像文本文件一样分配内存吗?使用缓冲区会有帮助吗?这些命令与 fprintf、sscanf 和其他语法内容相似还是不同?
这个例子应该有效
#define FILE "file path"
#define LEN 30
int main()
{
int read;
char *buffer;
HANDLE hFile = CreateFile(FILE, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE){
printf("[-] CreateFile() failed.\n");
return 0;}
buffer = (char*)malloc(LEN);
ReadFile(hFile, buffer, LEN, &read, NULL);
}
您读取的文件没有特殊标记。你提到你只需要前 30 个半字,这显然是前 30 个字节。 ReadFile()
有 nNumberOfBytesToRead
参数,所以你只需要传递 30。如果你愿意,你可以尝试读取一个 .exe 文件并打印你得到的东西。它应该以 MZ 和 "this program cannot be run in dos mode" 开头(您需要阅读超过 30 个字节才能看到所有内容)。一些 NULL 字节不会让你简单地打印它所以你应该尝试这种方式
int PrintBuffer(char *buffer)
{
int written;
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(out, buffer, LEN, &written, NULL);
CloseHandle(out);
}
编辑:没有winapi的版本
#define PATH "file path"
#define LEN 30
#define HWORD 1
int main()
{
int i = 0;
char *buffer = (char*)malloc(LEN);
FILE *f = fopen(PATH, "rb");
if(!f) printf("[-] fopen() failed.\n");
else printf("[+] fopen() succeeded.\n");
if(fread(buffer, HWORD, LEN, f) != LEN) printf("[-] fread() failed.\n");
else printf("[+] fread() succeeded.\n");
现在打印数据时没有 NULL 字节过早地切割输出
for(i = 0; i < LEN; i++) printf("%c", buffer[i]);
}
fread()
从文件中读取 "elements" 具有以下参数:
1.接收读取数据的缓冲区。
2. 每个元素的大小,以字节为单位。半字是一个字节,所以大小是1。
3.要读取的元素数量。在这种情况下 30。
4. 您用于 fopen()
的 FILE*。
return值为读取成功的元素个数,应该是30个。
我需要一些帮助,用 C 语言编写一个程序来从文件读取二进制值和向文件写入二进制值。对于这个程序,我不需要读入文件的全部内容(2048 字节),只需要读入前 30 个半字。
我确实知道如何编写一个程序来为文本文件执行此操作,但我不熟悉二进制文件。我需要像文本文件一样分配内存吗?使用缓冲区会有帮助吗?这些命令与 fprintf、sscanf 和其他语法内容相似还是不同?
这个例子应该有效
#define FILE "file path"
#define LEN 30
int main()
{
int read;
char *buffer;
HANDLE hFile = CreateFile(FILE, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE){
printf("[-] CreateFile() failed.\n");
return 0;}
buffer = (char*)malloc(LEN);
ReadFile(hFile, buffer, LEN, &read, NULL);
}
您读取的文件没有特殊标记。你提到你只需要前 30 个半字,这显然是前 30 个字节。 ReadFile()
有 nNumberOfBytesToRead
参数,所以你只需要传递 30。如果你愿意,你可以尝试读取一个 .exe 文件并打印你得到的东西。它应该以 MZ 和 "this program cannot be run in dos mode" 开头(您需要阅读超过 30 个字节才能看到所有内容)。一些 NULL 字节不会让你简单地打印它所以你应该尝试这种方式
int PrintBuffer(char *buffer)
{
int written;
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(out, buffer, LEN, &written, NULL);
CloseHandle(out);
}
编辑:没有winapi的版本
#define PATH "file path"
#define LEN 30
#define HWORD 1
int main()
{
int i = 0;
char *buffer = (char*)malloc(LEN);
FILE *f = fopen(PATH, "rb");
if(!f) printf("[-] fopen() failed.\n");
else printf("[+] fopen() succeeded.\n");
if(fread(buffer, HWORD, LEN, f) != LEN) printf("[-] fread() failed.\n");
else printf("[+] fread() succeeded.\n");
现在打印数据时没有 NULL 字节过早地切割输出
for(i = 0; i < LEN; i++) printf("%c", buffer[i]);
}
fread()
从文件中读取 "elements" 具有以下参数:
1.接收读取数据的缓冲区。
2. 每个元素的大小,以字节为单位。半字是一个字节,所以大小是1。
3.要读取的元素数量。在这种情况下 30。
4. 您用于 fopen()
的 FILE*。
return值为读取成功的元素个数,应该是30个。