如何在C语言中将十六进制文本文件还原为原始JPEG图片
把十六进制文本还原为JPEG图片的C语言实现
你之前的代码直接把imgHex.txt里的十六进制字符串原样写入JPEG文件,这肯定行不通——文本里的FF是两个ASCII字符(对应字节0x46和0x46),但原始JPEG里对应的是单个二进制字节0xFF。必须把每两个十六进制字符转换成一个二进制字节,再写入文件才能还原图片。
实现思路
- 打开十六进制文本文件(只读模式)和目标JPEG文件(二进制写入模式)
- 逐字符读取文本内容,跳过换行、空格这类非十六进制字符
- 每收集两个有效十六进制字符,将其合并转换成一个二进制字节
- 把转换后的字节写入JPEG文件
- 加入错误检查,避免文件打开失败等异常情况
完整代码示例
#include <stdio.h> #include <ctype.h> #include <stdlib.h> // 将单个十六进制字符转换为对应数值(0-15) int hex_char_to_val(char c) { if (isdigit(c)) { return c - '0'; } else if (isupper(c)) { return 10 + (c - 'A'); } else if (islower(c)) { return 10 + (c - 'a'); } return -1; // 返回-1表示无效字符 } int main() { FILE* hex_file; FILE* jpeg_file; errno_t err; // 打开十六进制文本文件 err = fopen_s(&hex_file, "C:\\Users\\name\\Documents\\imgHex.txt", "r"); if (err != 0) { printf("无法打开imgHex.txt文件\n"); return 1; } // 打开目标JPEG文件(二进制写入) err = fopen_s(&jpeg_file, "C:\\Users\\name\\Documents\\test.jpeg", "wb"); if (err != 0) { printf("无法创建test.jpeg文件\n"); fclose(hex_file); return 1; } char c; int byte_val = 0; int nibble_count = 0; // 记录已读取的半字节数(0或1) // 逐字符处理十六进制文本 while ((c = fgetc(hex_file)) != EOF) { int val = hex_char_to_val(c); if (val == -1) { continue; // 跳过无效字符(如换行、空格) } if (nibble_count == 0) { // 第一个半字节,左移4位预留低位空间 byte_val = val << 4; nibble_count = 1; } else { // 第二个半字节,合并成完整字节 byte_val |= val; // 将字节写入JPEG文件 fputc(byte_val, jpeg_file); nibble_count = 0; } } // 关闭文件 fclose(hex_file); fclose(jpeg_file); printf("图片还原完成\n"); return 0; }
代码关键点说明
hex_char_to_val函数:统一处理大小写十六进制字符,转换成对应数值- 跳过非十六进制字符:兼容带换行、空格的hex文本文件
- 半字节合并:确保每两个十六进制字符对应一个二进制字节,完全匹配原始图片的字节结构
- 错误检查:避免文件打开失败导致的程序崩溃
内容的提问来源于stack exchange,提问作者thimo
相关产品推荐
相关产品推荐

