Создание копии двоичного файла из его шестнадцатеричного представления - PullRequest
0 голосов
/ 20 февраля 2012

Я хотел бы сделать копию моего двоичного файла, но мне нужно сделать это из шестнадцатеричного представления моего двоичного файла.

В первой программе я создаю текстовый файл с шестнадцатеричным представлением моего двоичного файла.file:

#include <stdio.h>
#include <stdlib.h>

const int BYTE = 1;
int counter = 0;
int read;
long size;
FILE *file1 = NULL; 
FILE *file2 = NULL; 
fpos_t length;

int main() {

        unsigned char hex[3];
        unsigned char buffer[1];
        file1 = fopen("server.pdf", "rb");
        fseek(file1, 0, SEEK_END);
        fgetpos(file1, &length);
        size = length.__pos;
        fseek(file1, 0, SEEK_SET);
        if (file1) {
                file2 = fopen("test.txt", "w");
                while (counter < size) {
                        read = fread(buffer, 1, BYTE, file1);
                        counter += read;
                        i = 0;
                        while(i<read) {
                        sprintf(hex, "%02x", (unsigned int) buffer[i++]);
                        fwrite(hex, 1, BYTE, file2);
                        }
                }
        } else
        printf("ERROR");
        fclose(file1);
        fclose(file2);


}

Во втором случае я считываю данные из txt-файла и после этого записываю их в двоичный файл:

#include <stdio.h>

FILE *file1;
FILE *file2;
int size;
fpos_t length;
int main(){
        file1 = fopen("test.txt", "r");
        fseek(file1, 0, SEEK_END);
        fgetpos(file1, &length);
        size = length.__pos;
        fseek(file1, 0, SEEK_SET);
        char buffer[1];
        char hex[3];
        int counter = 0;
        int read;
        if(file1){
                file2 = fopen("test.pdf", "wb");
                while (counter < size) {
                read = fread(hex, 1, 3, file1);
                counter += read;
                sscanf(hex, "%02x", buffer);
                fwrite(buffer, 1, 1, file2);
                }
        }
        fclose(file1);
        fclose(file2);
}

К сожалению, я не могу открыть свою копию.В чем причина?

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Вы смотрели содержимое файлов?Вы не сможете вывести шестнадцатеричное представление в переменную hex, поскольку его размер составляет 1 байт.

Переменная hex объявлена ​​hex[BYTE], где BYTE = 1, но ваша строка формата sprintf выглядит следующим образом:"%02x" то есть 2 байта, тогда вам нужно место для завершающего нуля.

То же самое касается записи в файл, вы записываете только 1 байт из шестнадцатеричной строки.

Объявлениепеременная как: var[1] не имеет смысла, вы можете добиться того же с помощью var btw.

Кроме того, вы также должны добавить правильную обработку ошибок, если не можете успешно открыть файл.Это означает проверку указателя файла после вашего вызова fopen, а затем выполнение соответствующих действий.perror () напечатает строку ошибки, которая соответствует errno, и в случае несуществующего файла она напечатает что-то вроде: «нет такого файла или каталога» или подобное.

1 голос
/ 20 февраля 2012

Когда вы сказали, что не можете открыть свою копию, вы имеете в виду ошибку в fopen("test.txt", "r")?Вы проверили errno значение?Проверьте perror() и strerror().Кроме того, у вас нет цикла во второй программе.

...