目标:
打开一个包含二进制数据的文件,将整个文件读入内存,更改文件的某些部分,将内存缓冲区写入文件,关闭文件。赚取利润?
问题:
我刚开始学习C语言,无法找到足够的关于如何在内存缓冲区中更改二进制数据的信息。作为一个网络开发者(php、python、as3),这对我来说是新的领域。
背景:
我有一个函数,它接收文件路径和指向字符指针内存缓冲区的指针地址。然后它打开文件,在文件中循环并将数据写入内存缓冲区。最后关闭文件。
二进制文件的目的是保存一些对象的类别ID,它们的位置就是它们自己的ID。类别ID表示为2字节shorts。因此,它实际上只是一个充满了许多shorts的二进制文件,我希望能够读取和更改其中的内容。
以下是我目前拥有的内容:
main.c:
二进制文件的目的是保存一些对象的类别ID,它们的位置就是它们自己的ID。类别ID表示为2字节shorts。因此,它实际上只是一个充满了许多shorts的二进制文件,我希望能够读取和更改其中的内容。
以下是我目前拥有的内容:
main.c:
#include "binary-handler.h"
void showFileBuffer(char *buffer, unsigned int fileSize){
int i = 0;
for(; i < fileSize; ++i){
printf("<%d:%x>\n", i, ((char *)buffer)[i]);
}
}
int main(){
char path[] = "assets/map-squares.bin";
char *buffer;
int fileSize;
fileSize = readFileToMemory(path, &buffer);
showFileBuffer(buffer, fileSize);
//Code to change buffer
//Code to write buffer to file
return 0;
}
binary-handler.c:
#include <stdio.h>
#include <stdlib.h>
unsigned int getFileSize(FILE **file){
unsigned int size;
if(fseek(*file, 0, SEEK_END) == -1){ return -1; }
size = ftell(*file);
fseek(*file, 0, SEEK_SET);
return size;
}
char *getFileBuffer(FILE **file, unsigned int fileSize){
char *buffer = malloc(fileSize + 1);
fread(buffer, fileSize, 1, *file);
return buffer;
}
unsigned int readFileToMemory(char path[], char **buffer){
unsigned int fileSize;
FILE *file = fopen(path, "rb");
if(file != NULL){
fileSize = getFileSize(&file);
*buffer = getFileBuffer(&file, fileSize);
fclose(file);
return fileSize;
}else{
*buffer = NULL;
return -1;
}
}
1. 这段代码能正确地执行第一步(将文件读入内存)吗?
2. 如果是,我该如何更改缓冲区中的第二个对象的值为0F 00?
3. 如何将缓冲区写回文件?
4. 是否有一种方式可以以详细的方式检查缓冲区中的值?
总之,我只是想要帮助理解整个概念,以便自己解决问题。
谢谢!
编辑:删除了文件的循环。添加了一个打印整个缓冲区的函数。