我想复制我的二进制文件,但我需要从我的二进制文件的十六进制表示中创建它。
在第一个程序中,我使用十六进制表示我的二进制文件创建了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);
}
不幸的是我无法打开我的副本。是什么原因?
答案 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()
。
此外,你在第二个程序中没有循环。