.jpg文件转换成十六进制的文件?怎么转?

giffordguan 2005-02-18 02:17:55
谢谢啦,怎么转阿?
...全文
685 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2005-02-21
  • 打赏
  • 举报
回复
前面给的是示意性的代码,没有调试
ssprintf出错是因为再次读取后,ptemp2指针没有恢复到buffer2的首地址

一个二进制字符是8位,写成16进制占据2位,再加入一个空格嘛
比如,字符串AB ascii是 0x65 和 0x66,, 写成16进制就是“65 66 ”占据6个字节了
lona_ma 2005-02-19
  • 打赏
  • 举报
回复
为什么十六进制的buffer会比二进制的达3倍呢?
lona_ma 2005-02-19
  • 打赏
  • 举报
回复
sprintf 会内存出错,怎么回事啊?
寻开心 2005-02-18
  • 打赏
  • 举报
回复
unsigned char buffer[Buffer_Size+1]; // 保存的是从磁盘读出的二进制数据,+1做保护
unsigned char buffer2[Buffer_Size*3+1]; // 保存要转换的字符串,+1做保护
.....
int nLen = fread(buffer, sizeof(char), Buffer_Size, fin);
unsigned char * pTemp2 = buffer2;
while(nLen==Buffer_Size)
{
  for (int j=0; j<nLen; j++ ) {
ssprintf(pTemp2, "%02X ", buffer[j]);
pTemp2 += 3;
}; // 这样就把二进制的数据转换成为16进制的字符串,并且存储到buffer1当中了
fwrite( buffer1, sizeof(char), nLen*3, fout);
nLen = fread(buffer, sizeof(char), Buffer_Size, fin);
}
if (nLen)
{
for (int j=0; j<nLen; j++ ) {
ssprintf(pTemp2, "%02X ", buffer[j]);
pTemp2 += 3;
}; // 这样就把二进制的数据转换成为16进制的字符串,并且存储到buffer1当中了
fwrite( buffer1, sizeof(char), nLen*3, fout);
};
fclose(fin);
fclose(fout);
寻开心 2005-02-18
  • 打赏
  • 举报
回复
关于二进制方式打开,看fopen的说明函数吧
缺省的就是二进制方式
除非用_fmode()修改过
寻开心 2005-02-18
  • 打赏
  • 举报
回复
fwrite输出的就是二进制数据,不是字符串
所以你必须先把他们转换成为16进制的字符串数据然后再输出
unsigned char buffer[Buffer_Size+1]; // 保存的是从磁盘读出的二进制数据,+1做保护
unsigned char buffer2[Buffer_Size*3+1]; // 保存要转换的字符串,+1做保护
.....
int nLen = fread(...);
unsigned char * pTemp2 = buffer2;
while(nLen==Buffer_Size)
{
for (int j=0; j<Buffer_Size; j++ ) {
ssprintf(pTemp, "%02X ", buffer[j]);
pTemp2 += 3;
}; // 这样就把二进制的数据转换成为16进制的字符串,并且存储到buffer1当中了
fwrite( buffer1, sizeof(char), Buffer_Size*3, fout);
nLen = fread(。。。。);
}
if (nLen)
{
  和上面类似的代码,把Buffer_Size全部替换成nLen即可
};
ckc 2005-02-18
  • 打赏
  • 举报
回复
fopen(文件名,"rb")
就可以用二进制打开读了
giffordguan 2005-02-18
  • 打赏
  • 举报
回复
fopen 什么叫做以二进制打开?

if ((fp=fopen(argv[1],"r+"))==NULL) /*打开源文件失败*/
{ printf("can not open source file\n");
exit(0);
}
input = fp;
giffordguan 2005-02-18
  • 打赏
  • 举报
回复
谢谢啦~~ 可是 怎么保证 fwrite 写出的是十六进制的啊? 小妹刚刚入门,见谅阿~~
寻开心 2005-02-18
  • 打赏
  • 举报
回复
写错了
把上面的1024数据都换成16,
len = fread(buffer, sizeof(char), 16, file);
用16的目的是仿照ultraedit的方式,每行16个读一次,这样效率也比较低,但是处理代码好做一些。

不考虑输出具体如何处理的时候,这个语句应该这样写
#define Buffer_Size 1024
// 缓冲大小,一次读取1k
unsigned char buffer[Buffer_Size];
int len = fread(buffer, sizeof(char), Buffer_Size, file);
while(len==Buffer_Size)
{
输出,后面可能还有
len = fread(buffer, sizeof(char), Buffer_Size, file);
};
if ( len ) {
输出,后面肯定没有了
}
fclose
寻开心 2005-02-18
  • 打赏
  • 举报
回复
处理的方式有问题
不应该这样做
用getc的效率极其低下

正确方法:
用fopen以二进制方式打开,不要用文本方式

读取二进制数据,应该用fread读入到缓冲区,根据fread返回的数值判断是否结束了
比如
unsigned char buffer[16];
int len = fread(buffer, sizeof(char), 1024, file);
while(len==16)
{
输出,后面可能还有
len = fread(buffer, sizeof(char), 1024, file);
};
if ( len ) {
输出,后面肯定没有了
}
fclose
giffordguan 2005-02-18
  • 打赏
  • 举报
回复
哦 还有 怎么把数据读入buffer? 各位大哥,帮帮小妹了。。
giffordguan 2005-02-18
  • 打赏
  • 举报
回复
我现在写的程序如下:
问题是,读完jpg的头文件就会终止,不会继续向下读,有什么办法吗?

for( ; (!feof(input)) ; )
// for (i=0; i<=0x54b0; i++) //5*16^3+4*16^2+11*16+0=20480+1024+176=21656
{
for(i=0; i<=16; i++)
{
ch = fgetc(input);

printf("0x%x", ch);
printf(", ");
fputc(ch,output);
}
printf("\n");


}
fclose(input); fclose(output);
sky911911 2005-02-18
  • 打赏
  • 举报
回复
关注ing。。。。。。。。
寻开心 2005-02-18
  • 打赏
  • 举报
回复
jpg文件在磁盘上本来就是一个二进制文件
这个问题等价于二进制文件的显示问题

首先按照二进制的方式把数据读入unsigned char类型
假定
unsigned char * pBuffer是数据的内容
你要16个一行的显示那么
pBuffer的长度是nLen
unsigned char * pTemp = pBuffer;
for ( int i=0; i<nLen>>4; i++ )
{
for ( int j=0; j<16; j++ )
sprintf("%02X ", *p(Temp++)); // 输出 A1 B2 10 3C 48 29 00 45 78 F3 EF F3 00 22 00
// 这种样式
sprintf("\n"); // 换行
}
for ( i=((nLen>>4) <<4); i<nLen; i++ )
sprintf("%02X", *pTemp++);
// 输出剩余的部分
fangyingjf 2005-02-18
  • 打赏
  • 举报
回复
问一下,.jpg的每一个象素点的rgb怎么得到啊
michaelz2001 2005-02-18
  • 打赏
  • 举报
回复
逐个字节读出来, 用fprintf写到一个txt文件里去
giffordguan 2005-02-18
  • 打赏
  • 举报
回复
用.txt文件写出来,吧.jpg用十六进制代码表示出来,怎么转过去啊?

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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