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 目的 要 根据格式 加大。
[其他解释]
char *rdata;
rdata=new char[2 * endlen];
hex_of_uc(rdata,p,endlen);
[其他解释]
UP
[其他解释]
大侠都没起床吗
[其他解释]
hex_of_uc函数没有代码,可能是hex_of_uc这个函数里出错,你单步执行到这个函数里看看是哪条语句出的问题,是不是这个函数的第三个参数类型不对导致溢出了
[其他解释]
UP
[其他解释]
这是这个函数的代码,应该不会有错的,很简单的一个循环转化
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长的数组,这个会有内存越界的问题吧。
[其他解释]
那应该endlen/2?
[其他解释]
图片出来就是这么大吗,动不动十几万字节?
[其他解释]
hex_of_uc(rdata,p,2000);
AfxMessageBox(rdata);
用这个输出的时候 没这么多字节的啊,后面全是0 了
[其他解释]
一个字节转换为ASC码需要2个字节的存储空间
[其他解释]
具体怎么改?
[其他解释]
你读到文件大小以后,new一个BYTE[]的buffer,然后调用fread()一次读取到buffer中,再把buffer格式化成十六进制的方式输出来不就行了
[其他解释]
我明白你的意思,字节,字符,数值转化导致大小不一,但怎么解决啊
[其他解释]
使用fprintf?
[其他解释]
不会报错,程序死掉了,太大了吧
[其他解释]
不对
[其他解释]
如:
p = new unsigned char[5*endlen];
[其他解释]
格式化成十六进制的方式输出具体指的什么?
[其他解释]
谢谢大家,出来了,但是图片太大会很卡,有什么好的办法吗?
[其他解释]
程序死了,占很大CPU
[其他解释]
null
------其他解决方案--------------------
用映射文件应该能快点