将十六进制的数据转换成图片

一个不会编程的小白菜 2017-08-11 03:30:39
如题所述,如何将 FF D8 开头, FF D9 结尾的 十六进制的数据保存为jpg图片, 之前看了好多人的帖子,但是试过了好像都不行啊 ,还是我理解的有问题, 我用的是 c++语言 ,求教啊 !!~ VS2010平台 , 之前看过zhao4zhong1老师的回复,但是也没搞清楚啊 ,本人是新手,还望大佬详细介绍一下,造福我们这行刚毕业的小菜鸟。。。。

补充说明一下: 我是先用fopen创建打开了一个.jpg的文件,然后将FF D8 开头,FF D9 结束的 数据都写进去了,但是打开图片的时候显示 此文件可能已损坏,但是我将其,JPG的后缀改成.TXT,然后将里面的数据拷贝出来,用 十六进制转换图片的工具,能够将图片成功的显示出来,说明数据是没用问题的,现在就是不知道如果将这些十六进制的数据转换成图片保存。
...全文
3218 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
suxinghe39 2019-03-18
  • 打赏
  • 举报
回复
可不可以 直接丢进 16进制 查看器 里面 再保存 呢 ?
Miaomidamao 2018-02-09
  • 打赏
  • 举报
回复
楼主,楼上的代码就能用,真是谢谢了
Miaomidamao 2018-02-09
  • 打赏
  • 举报
回复
楼主有详细的C++转化十六进制到jpeg图片的代码吗,希望能求一份,万分感谢 1178998561@qq.com
  • 打赏
  • 举报
回复
引用 18 楼 qq_36369472 的回复:
c语言可以实现hex转化.jpg吗
应该是可以的,你就按照赵4老师给我提供的方法来写就可以了,我使用c++已经实现了
qq_36369472 2017-12-17
  • 打赏
  • 举报
回复
c语言可以实现hex转化.jpg吗
赵4老师 2017-08-14
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵4老师 2017-08-14
  • 打赏
  • 举报
回复
7楼代码完成“读取hex文件转为jpg文件”功能。 举个例子:你recv "ABC",难道你往结果文件中保存一个0xAB,半个0xC字节不成?!
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
象你这样边recv,边转换,不考虑收到奇数个字节咋办是不行的! 只能改为 第一步:只管recv,fwrite到hex文件中。 第二步:读取hex文件转为jpg文件。
赵老师,我看您给的程序也是一个字节一个字节写入的呀,我的也是一个字节一个字节写入的呀,我目前来说能够保证recv收到的数据是正确的。 赵老师啊,可不可以问一下“”读取hex文件转为jpg文件“”。,怎么做?
赵4老师 2017-08-14
  • 打赏
  • 举报
回复
象你这样边recv,边转换,不考虑收到奇数个字节咋办是不行的! 只能改为 第一步:只管recv,fwrite到hex文件中。 第二步:读取hex文件转为jpg文件。
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
万一recv收到奇数个字节咋办?! 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
赵老师,我从客户端收到的数据,转化成十六进制之后,存到txt文件中,将文件中的十六进制数据用 工具 能转化成图片,说明收到的数据是正确的,先不考虑这一点。 您觉得我就是将数据写入到文件中哪个地方有问题啊?数据是从 FF D8 开始写的 ,FF D9结束的。现在就是将正确的数据写入到文件中不能变成图片,我创建的文件名字是 .JPG 格式的。我是哪个环节出现了问题,捣鼓一个星期了
赵4老师 2017-08-14
  • 打赏
  • 举报
回复
万一recv收到奇数个字节咋办?! 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
这还不简单? 参考下面:
#include <stdio.h>
#include <string.h>
#include <conio.h>
FILE *fi,*fo;
int r;
unsigned int n,c;
long offset;
//-------------------------------------------------------
void main(int argc,char *argv[])
{
    if (argc<3) {
        cprintf("Hex2Bin srcfile desfile");
        return;
    }
    if ((fi=fopen(argv[1],"rb"))==NULL) {
        cprintf("Can not find file %s",argv[1]);
        return;
    }
    if ((fo=fopen(argv[2],"wb"))==NULL) {
        fclose(fi);
        cprintf("Can not create file %s",argv[2]);
        return;
    }
    n=0;
    while (1) {
        offset=ftell(fi);
        r=fscanf(fi,"%2x",&c);
        if (EOF==r) break;//
        if (1==r) {
            fputc(c,fo);
            n++;
        } else {//0==r
            fseek(fi,offset,SEEK_SET);//因为VC6的Release版及其VC7,8,9,10,...版的fscanf未按约定保持offset不变,所以此处必须恢复offset
            r=fgetc(fi);
            if (EOF==r) break;//
        }
    }
    fcloseall();
    cprintf("OK to Hex2Bin %d bytes.",n);
}
赵老师,您好,您看看我按照您写的这个程序 ,我整理的对么?
unsigned int c;
FILE *jpgpicture01;
CString strbyte,str001[1024];
char strLogFile[512]; 

iRecvLen = recv(pt->sock.sock_handle, pt->sock.msg, _YDLOGMAXBUF,0); //接收socket数据

jpgpicture01=fopen(strLogFile,"ab+");	//	strLogFile文件名,“ab+”	以读/写方式打开一个二进制文件,允许读或在文件末追加数据。
                                        //  因为我接收的数据是“客户端socket分段发送”过来的,要多次打开和关闭文件,所以每次打开文件之后要从文件尾开始写数据					
	
						
	 for(int i=0;i<iRecvLen;i++)
		{					
			strbyte.Format("%02X",pt->sock.msg[i]);  //将接收到的数据强制转换成十六进制
		    str001[i]=strbyte.Right(2);     //我发现发过来的数据pt->sock.msg[i],只有最右边的两位有效,比如socket发送的是0xDB
			                               // 比如客户端socket发送的是0xDB,我这边收到的是FFFFFFDB,所以我进行了提取
			c=atoi(str001[i]);    //将提取的十六进制数据转换成无符号整型,按照zhao4zhong1老师写的程序
            fputc(c,jpgpicture01);																			
		}
					
					
fclose(jpgpicture01);
					
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
这还不简单? 参考下面:
#include <stdio.h>
#include <string.h>
#include <conio.h>
FILE *fi,*fo;
int r;
unsigned int n,c;
long offset;
//-------------------------------------------------------
void main(int argc,char *argv[])
{
    if (argc<3) {
        cprintf("Hex2Bin srcfile desfile");
        return;
    }
    if ((fi=fopen(argv[1],"rb"))==NULL) {
        cprintf("Can not find file %s",argv[1]);
        return;
    }
    if ((fo=fopen(argv[2],"wb"))==NULL) {
        fclose(fi);
        cprintf("Can not create file %s",argv[2]);
        return;
    }
    n=0;
    while (1) {
        offset=ftell(fi);
        r=fscanf(fi,"%2x",&c);
        if (EOF==r) break;//
        if (1==r) {
            fputc(c,fo);
            n++;
        } else {//0==r
            fseek(fi,offset,SEEK_SET);//因为VC6的Release版及其VC7,8,9,10,...版的fscanf未按约定保持offset不变,所以此处必须恢复offset
            r=fgetc(fi);
            if (EOF==r) break;//
        }
    }
    fcloseall();
    cprintf("OK to Hex2Bin %d bytes.",n);
}
赵老师,您好,您看看我按照您写的这个程序 ,我整理的对么?
unsigned int c; FILE *jpgpicture01; CString strbyte,str001[1024]; char strLogFile[512]; iRecvLen = recv(pt->sock.sock_handle, pt->sock.msg, _YDLOGMAXBUF,0); //接收socket数据 jpgpicture01=fopen(strLogFile,"ab+"); // strLogFile文件名,“ab+” 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。 // 因为我接收的数据是“客户端socket分段发送”过来的,要多次打开和关闭文件,所以每次打开文件之后要从文件尾开始写数据 for(int i=0;i<iRecvLen;i++) { strbyte.Format("%02X",pt->sock.msg[i]); //将接收到的数据强制转换成十六进制 str001[i]=strbyte.Right(2); //我发现发过来的数据pt->sock.msg[i],只有最右边的两位有效,比如socket发送的是0xDB // 比如客户端socket发送的是0xDB,我这边收到的是FFFFFFDB,所以我进行了提取 c=atoi(str001[i]); //将提取的十六进制数据转换成无符号整型,按照zhao4zhong1老师写的程序 fputc(c,jpgpicture01); } fclose(jpgpicture01);
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
这还不简单? 参考下面:
#include <stdio.h>
#include <string.h>
#include <conio.h>
FILE *fi,*fo;
int r;
unsigned int n,c;
long offset;
//-------------------------------------------------------
void main(int argc,char *argv[])
{
    if (argc<3) {
        cprintf("Hex2Bin srcfile desfile");
        return;
    }
    if ((fi=fopen(argv[1],"rb"))==NULL) {
        cprintf("Can not find file %s",argv[1]);
        return;
    }
    if ((fo=fopen(argv[2],"wb"))==NULL) {
        fclose(fi);
        cprintf("Can not create file %s",argv[2]);
        return;
    }
    n=0;
    while (1) {
        offset=ftell(fi);
        r=fscanf(fi,"%2x",&c);
        if (EOF==r) break;//
        if (1==r) {
            fputc(c,fo);
            n++;
        } else {//0==r
            fseek(fi,offset,SEEK_SET);//因为VC6的Release版及其VC7,8,9,10,...版的fscanf未按约定保持offset不变,所以此处必须恢复offset
            r=fgetc(fi);
            if (EOF==r) break;//
        }
    }
    fcloseall();
    cprintf("OK to Hex2Bin %d bytes.",n);
}
赵老师,您好,您看看我按照您写的这个程序 ,我整理的对么? [code=c][unsigned int c; FILE *jpgpicture01; CString strbyte,str001[1024]; char strLogFile[512]; iRecvLen = recv(pt->sock.sock_handle, pt->sock.msg, _YDLOGMAXBUF,0); //接收socket数据 jpgpicture01=fopen(strLogFile,"ab+"); // strLogFile文件名,“ab+” 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。 // 因为我接收的数据是“客户端socket分段发送”过来的,要多次打开和关闭文件,所以每次打开文件之后要从文件尾开始写数据 for(int i=0;i<iRecvLen;i++) { strbyte.Format("%02X",pt->sock.msg[i]); //将接收到的数据强制转换成十六进制 str001[i]=strbyte.Right(2); //我发现发过来的数据pt->sock.msg[i],只有最右边的两位有效,比如socket发送的是0xDB // 比如客户端socket发送的是0xDB,我这边收到的是FFFFFFDB,所以我进行了提取 c=atoi(str001[i]); //将提取的十六进制数据转换成无符号整型,按照zhao4zhong1老师写的程序 fputc(c,jpgpicture01); } fclose(jpgpicture01); ]
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
谢谢,赵老师,可以了~!实现了,太高兴了 我去完善代码了,分都给你吧~!
赵4老师 2017-08-11
  • 打赏
  • 举报
回复
这还不简单? 参考下面:
#include <stdio.h>
#include <string.h>
#include <conio.h>
FILE *fi,*fo;
int r;
unsigned int n,c;
long offset;
//-------------------------------------------------------
void main(int argc,char *argv[])
{
    if (argc<3) {
        cprintf("Hex2Bin srcfile desfile");
        return;
    }
    if ((fi=fopen(argv[1],"rb"))==NULL) {
        cprintf("Can not find file %s",argv[1]);
        return;
    }
    if ((fo=fopen(argv[2],"wb"))==NULL) {
        fclose(fi);
        cprintf("Can not create file %s",argv[2]);
        return;
    }
    n=0;
    while (1) {
        offset=ftell(fi);
        r=fscanf(fi,"%2x",&c);
        if (EOF==r) break;//
        if (1==r) {
            fputc(c,fo);
            n++;
        } else {//0==r
            fseek(fi,offset,SEEK_SET);//因为VC6的Release版及其VC7,8,9,10,...版的fscanf未按约定保持offset不变,所以此处必须恢复offset
            r=fgetc(fi);
            if (EOF==r) break;//
        }
    }
    fcloseall();
    cprintf("OK to Hex2Bin %d bytes.",n);
}
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用 https://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/


赵老师啊,你写的代码有点蒙啊,我就是想把十六进制的数据转换成图片,
  • 打赏
  • 举报
回复
引用 1 楼 codedoctor 的回复:
你要注意,.jpg格式的图片的编码其头部还包含了大量的数据信息和调试信息,那个工具就是帮你做了填充头部信息的工作。具体怎么实现我不好多说,你可以上github上搜索一下具体的编码解码格式和jpg的头部信息串


文件头信息 不就是 FF D8 FF E0 00 10 .......难道好需要添加别的?
feitianxiaozi 2017-08-11
  • 打赏
  • 举报
回复
文件头信息 +数据,一点点写入进去跟普通文件没区别。
赵4老师 2017-08-11
  • 打赏
  • 举报
回复
JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用 https://www.ibm.com/developerworks/cn/linux/l-cn-jpeg/
加载更多回复(2)

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧