从十六进制表示形式创建二进制文件的副本

时间:2012-02-20 09:01:53

标签: c binary hex

我想复制我的二进制文件,但我需要从我的二进制文件的十六进制表示中创建它。

在第一个程序中,我使用十六进制表示我的二进制文件创建了txt文件:

#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 个答案:

答案 0 :(得分:2)

你看过文件内容了吗?您将无法将十六进制表示sprintf到变量hex,因为它的大小为1个字节。

变量十六进制被声明为hex[BYTE],其中BYTE = 1,但您的sprintf格式字符串如下所示:"%02x"即2个字节,那么您需要留出终止零空间。

当您写入文件时也是如此,您只能从十六进制字符串中写入1个字节。

将变量声明为:var[1]毫无意义,您可以使用var btw实现相同的目标。

除此之外,如果无法成功打开文件,还应添加正确的错误处理。这意味着在调用fopen后检查文件指针,然后采取适当的操作。 perror()将打印一个与errno对应的错误字符串,如果文件不存在,它将打印如下内容:“没有这样的文件或目录”或类似内容。

答案 1 :(得分:1)

当您说无法打开副本时,您的意思是fopen("test.txt", "r")中有错误?你检查errno价值了吗?检查perror()strerror()。 此外,你在第二个程序中没有循环。