首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

C/C++ 图片文件打开后获取长度有关问题

2012-12-15 
C/C++ 图片文件打开后获取长度问题fp fopen(dc.bmp, rb)if(fpNULL) {AfxMessageBox(读取文件出

C/C++ 图片文件打开后获取长度问题


fp = fopen("dc.bmp", "rb");
if(fp==NULL) 
{
AfxMessageBox("读取文件出错!");
return;
}

fseek(fp,0,SEEK_END);
endlen = ftell(fp);
fseek(fp, 0, SEEK_SET);
p = new unsigned char[endlen];
fread(p, 1, endlen, fp);
fclose(fp);

CString out;
out.Format("%d",endlen);
m_print+=out;
m_printctrl.SetSel(0,-1);
m_printctrl.ReplaceSel(m_print);

char *rdata;
rdata=new char[endlen];
hex_of_uc(rdata,p,endlen);
AfxMessageBox(rdata);
delete []rdata;


主要代码都在这里了 
输出endlen 长度为131570,试了很多其他方法也是这么多
hex_of_uc(rdata,p,endlen);这个函数是自己写的一个循环转化成十六进制字符,第三个参数是长度  
hex_of_uc(rdata,p,1000);这样输出是没有问题的,但是换了长度,也就是131570内存就出错了,也就是长度不对
我就想让他输出一张图片的十六进制字符,总是输出不全。
[最优解释]

char *rdata =new char[endlen*2 + 1];
rdata[endlen*2] = 0;
hex_of_uc(rdata,p,endlen); 
AfxMessageBox(rdata); 
delete []rdata;
 


[其他解释]
p = new unsigned char[endlen];
...
char *rdata;
rdata=new char[endlen];
hex_of_uc(rdata,p,endlen);// p是 dest 目的吧即 hex ,rdata 是 src 吧。
你知道 一个 字节 变为 hex 要 2个 字节吗?
如 byte 0x0C;//数 
变为 hex ‘0C’2个字节
如果变为  ‘0x0C ’ 就是 5个 字节
所以 p是 dest 目的 要 根据格式 加大。 
[其他解释]
引用:
引用:
你的程序中cskey数组应该是uckey的2倍吧,你是把uckey的值转成16进制后放到cskey的2个字节中。
但你传入的rdata是endlen长的数组,p也是endlen长的数组,这个会有内存越界的问题吧。
那应该endlen/2?



char *rdata; 
rdata=new char[2 * endlen]; 
hex_of_uc(rdata,p,endlen); 

[其他解释]
UP
[其他解释]
大侠都没起床吗
[其他解释]
hex_of_uc函数没有代码,可能是hex_of_uc这个函数里出错,你单步执行到这个函数里看看是哪条语句出的问题,是不是这个函数的第三个参数类型不对导致溢出了
[其他解释]
UP
[其他解释]
引用:
hex_of_uc函数没有代码,可能是hex_of_uc这个函数里出错,你单步执行到这个函数里看看是哪条语句出的问题,是不是这个函数的第三个参数类型不对导致溢出了


这是这个函数的代码,应该不会有错的,很简单的一个循环转化

         char charhexstr_of_uchar(char *cskey,unsigned char *uckey,unsigned long ullen)
{
unsigned long i;
char chams3[3];
char *cham=chams3;
for(i=0;i<ullen;i++)
{
sprintf(cham,"%02X",uckey[i]);
cskey[   i<<1 ]=cham[0];
cskey[1+(i<<1)]=cham[1];
}
cskey[   ullen<<1 ]=0;
return 0x27;
}

char hex_of_uc(char *cskey,unsigned char *uckey,unsigned long ullen)
{
return charhexstr_of_uchar(cskey,uckey,ullen);
}

------其他解决方案--------------------


大侠,哪里错了啊
[其他解释]
你的程序中cskey数组应该是uckey的2倍吧,你是把uckey的值转成16进制后放到cskey的2个字节中。
但你传入的rdata是endlen长的数组,p也是endlen长的数组,这个会有内存越界的问题吧。
[其他解释]

引用:
你的程序中cskey数组应该是uckey的2倍吧,你是把uckey的值转成16进制后放到cskey的2个字节中。
但你传入的rdata是endlen长的数组,p也是endlen长的数组,这个会有内存越界的问题吧。

那应该endlen/2?
[其他解释]
图片出来就是这么大吗,动不动十几万字节?
[其他解释]

hex_of_uc(rdata,p,2000);
AfxMessageBox(rdata);
用这个输出的时候 没这么多字节的啊,后面全是0 了

[其他解释]
一个字节转换为ASC码需要2个字节的存储空间
[其他解释]
引用:
一个字节转换为ASC码需要2个字节的存储空间

具体怎么改?
[其他解释]
你读到文件大小以后,new一个BYTE[]的buffer,然后调用fread()一次读取到buffer中,再把buffer格式化成十六进制的方式输出来不就行了
[其他解释]
引用:
p = new unsigned char[endlen];
...
char *rdata;
rdata=new char[endlen];
hex_of_uc(rdata,p,endlen);// p是 dest 目的吧即 hex ,rdata 是 src 吧。
你知道 一个 字节 变为 hex 要 2个 字节吗?
如 byte 0x0C;//数 
变为……

我明白你的意思,字节,字符,数值转化导致大小不一,但怎么解决啊
[其他解释]
引用:
你读到文件大小以后,new一个BYTE[]的buffer,然后调用fread()一次读取到buffer中,再把buffer格式化成十六进制的方式输出来不就行了


使用fprintf?
[其他解释]
引用:
C/C++ code??123456char *rdata =new char[endlen*2 + 1];rdata[endlen*2] = 0;hex_of_uc(rdata,p,endlen); AfxMessageBox(rdata); delete []rdata;


不会报错,程序死掉了,太大了吧
[其他解释]
引用:
引用:引用:
你的程序中cskey数组应该是uckey的2倍吧,你是把uckey的值转成16进制后放到cskey的2个字节中。
但你传入的rdata是endlen长的数组,p也是endlen长的数组,这个会有内存越界的问题吧。
那应该endlen/2?

C/C++ code??1234char *rd……

不对
[其他解释]
如:
p = new unsigned char[5*endlen];
[其他解释]
引用:
你读到文件大小以后,new一个BYTE[]的buffer,然后调用fread()一次读取到buffer中,再把buffer格式化成十六进制的方式输出来不就行了


格式化成十六进制的方式输出具体指的什么?
[其他解释]
谢谢大家,出来了,但是图片太大会很卡,有什么好的办法吗?
[其他解释]
引用:
如:
p = new unsigned char[5*endlen];

程序死了,占很大CPU
[其他解释]
null
------其他解决方案--------------------


用映射文件应该能快点

热点排行