本地文件为十六进制数据形式, 读取文件内容并转化为二进制数据,写入到另一个文件中
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
// 辅助函数:将十六进制字符转换为数值 (0-15)
int hex_char_to_value(char c) {
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
if (c >= 'A' && c <= 'F')
return c - 'A' + 10;
return -1; // 无效字符
}
// 将十六进制字符串解析为二进制数据,写入输出文件
int process_hex_file(FILE *infile, FILE *outfile) {
int c;
int hi, lo;
unsigned char byte;
while ((c = fgetc(infile)) != EOF) {
if (isspace(c)) continue; // 跳过空白字符(空格、换行等)
hi = hex_char_to_value(c);
if (hi == -1) {
fprintf(stderr, "错误:无效的十六进制字符 '%c'\n", c);
return -1;
}
c = fgetc(infile);
if (c == EOF) {
fprintf(stderr, "错误:十六进制字符串不完整(奇数个字符)\n");
return -1;
}
if (isspace(c)) {
// 如果遇到空格,说明前一个字符是单独的(如 "f" 而不是 "ff")
fprintf(stderr, "错误:单个十六进制字符 '%c' 出现在输入中\n", hi + '0');
return -1;
}
lo = hex_char_to_value(c);
if (lo == -1) {
fprintf(stderr, "错误:无效的十六进制字符 '%c'\n", c);
return -1;
}
byte = (hi << 4) | lo;
fputc(byte, outfile);
}
return 0;
}
int main(int argc, char *argv[]) {
const char *input_filename;
const char *output_filename;
FILE *infile, *outfile;
// 命令行参数处理
if (argc != 3) {
printf("用法: %s <输入十六进制文件> <输出二进制文件>\n", argv[0]);
return 1;
}
input_filename = argv[1];
output_filename = argv[2];
// 打开输入文件(文本模式读取)
infile = fopen(input_filename, "r");
if (!infile) {
perror("无法打开输入文件");
return 1;
}
// 打开输出文件(二进制写入)
outfile = fopen(output_filename, "wb");
if (!outfile) {
perror("无法打开输出文件");
fclose(infile);
return 1;
}
printf("正在将十六进制数据从 '%s' 转换为二进制并写入 '%s'...\n", input_filename, output_filename);
// 执行转换
if (process_hex_file(infile, outfile) != 0) {
fprintf(stderr, "转换失败。\n");
fclose(infile);
fclose(outfile);
return 1;
}
printf("转换成功!\n");
fclose(infile);
fclose(outfile);
return 0;
}

5163

被折叠的 条评论
为什么被折叠?



