簡體   English   中英

C:將二進制文件讀取到內存,更改緩沖區,將緩沖區寫入文件

[英]C: read binary file to memory, alter buffer, write buffer to file

目標:用二進制數據打開文件,將整個文件讀入內存,更改文件的某些部分,將內存緩沖區寫入文件,關閉文件。 利潤?

問題:我剛剛開始學習C,但是我找不到有關如何更改內存緩沖區中二進制數據的足夠信息。 來自Web開發人員背景(php,python,as3)這對我來說是一個新的領域。

上下文:我有一個函數,它接受文件的路徑和指針地址到char指針的內存緩沖區。 然后打開文件,遍歷文件並將數據寫入內存緩沖區。 最后關閉文件。

二進制文件的目的是為某些對象保存category-id,它們的位置是它們自己的id。 category-id表示為2字節短路。 所以基本上它只是一個二進制文件,里面裝滿了很多我希望能夠閱讀和更改的短褲。

這是我到目前為止所得到的:

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;
}

二進制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.有沒有辦法讓我以冗長的方式檢查緩沖區中的值?

總而言之,我只想幫助掌握整個概念,以便我自己解決這個問題。

謝謝!

編輯:刪除了文件的循環。 添加了打印整個緩沖區的功能。

1)不。你不需要在getFileBuffer循環,因為你用fread讀取了整個文件。 您也不需要調用fseek因為每次從文件中讀取時,您都將自動在文件流中前進。 我沒有調試你的代碼,但看起來當你的循環完成時,緩沖區中的每個元素都將包含相同的值,它將等於文件中的最后一個字節。

注意:您為fread指定的參數是向后的。 第二個參數是您正在讀取的類型的大小,應該是sizeof(char) 第三個參數應該是您想要讀取的字符數量,應該是fileSize 但是,您的代碼仍然可以正常工作,但是當您正在讀取1個字節長的fileSize對象時,它希望讀取1個長度為fileSize字節的對象。

2)您可以像這樣讀取第二個短值(小端):

short n = 0;
n |= buffer[2] << 0;
n |= buffer[3] << 8;

您可以將短文寫回文件,如下所示:

buffer[2] = n >> 0;
buffer[3] = n >> 8;

3) fwrite

4)我不明白你在問什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM