文件转换为数组或者指针的问题!

mibo2 2007-08-22 01:37:01
while (fread(data,sizeof(short),Enc_Inst.blockl,ifileid)==Enc_Inst.blockl)
{
len=encode(&Enc_Inst, encoded_data, data);

fwrite(encoded_data, sizeof(unsigned char), len, efileid);

}

注释:

Enc_Inst.blockl为一个固定值,是每次从文件写到缓冲区的个数.
ifileid为文件指针,是等待压缩的文件指针。
data是缓冲区.存放等待压缩的数据.
encode(&Enc_Inst, encoded_data, data);是一个压缩处理函数,返回压缩后数据的长度.len为short型.

efileid为文件指针,是压缩后文件指针。
len是上面压缩后得到的数据长度.
encoded_data是缓冲区,存放压缩以后的数据.


现在我想把这段代码中的文件去掉,就是把ifileid和efileid也换成缓冲区(指针或者数组都可以).我改后无法实现原有的功能,请高手帮帮忙,怎么才能实现把文件转换为缓冲区?

谢谢大家了。


...全文
316 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqpp 2007-08-22
  • 打赏
  • 举报
回复
如果你不想改变整个函数的话,就从新实现一下fread和fwrite改称操作缓冲区的
struct MF{
unsigned int _size;
unsigned int _len;
unsigned char * buff;
};

int _fread( void* buff, int size, int len, struct MF *f )
{
int nread = size*len;

if ( nread + offset >= size )
nread = size - offset;
memcpy( buff, f->buff + offset, nread );
f->offset += nread;

return nread;
}

#define fread( _b, _s, _l, _f ) _fread( _b, _s, _l, (struct MF*)(_f) )
而在你打开原来ifileid的地方 struct MF _tf; _tf.offset = 0; _tf.size = input buffer size; _tf.buff = input buffer
fwrite一样处理
goodluckyxl 2007-08-22
  • 打赏
  • 举报
回复
Maybe,it will work ok
goodluckyxl 2007-08-22
  • 打赏
  • 举报
回复
while(StartLen>=Enc_Inst.blockl)
//while(StartLen>=Enc_Inst.blockl*sizeof(short))
mibo2 2007-08-22
  • 打赏
  • 举报
回复
我把代码重新整理了一下,问题仍然存在.
mibo2 2007-08-22
  • 打赏
  • 举报
回复
void InteEncode(unsigned char* StartData,int StartLen,int mode,unsigned char* EndData,int* EndLen)
{
short data[BLOCKL_MAX];
short encoded_data[ILBCNOOFWORDS_MAX];
int len;

iLBC_Enc_Inst_t Enc_Inst;
initEncode(&Enc_Inst, mode);

while(StartLen>=Enc_Inst.blockl)
{
memcpy(data,StartData,sizeof(short)*Enc_Inst.blockl);

StartLen -= sizeof(short)*Enc_Inst.blockl;
StartData += sizeof(short)*Enc_Inst.blockl;

len=encode(&Enc_Inst, encoded_data, data);

memcpy(EndData,encoded_data,sizeof(unsigned char)*len);

EndData +=sizeof(unsigned char)*len;
(*EndLen) +=sizeof(unsigned char)*len;
}
}
goodluckyxl 2007-08-22
  • 打赏
  • 举报
回复
memcpy(data,orginalData,sizeof(short)*Enc_Inst.blockl);

dataLength -= Enc_Inst.blockl;
orginalData += Enc_Inst.blockl;

长度可能出错
dataLength -= sizeof(short)*Enc_Inst.blockl;
orginalData += sizeof(short)*Enc_Inst.blockl;
goodluckyxl 2007-08-22
  • 打赏
  • 举报
回复
文件改为指针那就更简单了

可能在
1.*endataLen 在最前面赋0 初始否则可能外面不初始会乱掉
2.while(dataLength>=Enc_Inst.blockl) 把>=改为> 如果正好相等不知道memcpy会不会出问题
或者encoude函数会不会判别0的情况
cceczjxy 2007-08-22
  • 打赏
  • 举报
回复
执行出错还是加密的数据不对?

别的地方没发现什么异常,不过就是对末尾数据的处理上两个程序不一样
你仔细看一下你原来的程序,在最后的的数据不够Enc_Inst.blockl的大小时,是不对那些数据加密的.
而你后来改的,对最后的数据,即使不够,你也进行了加密.



mibo2 2007-08-22
  • 打赏
  • 举报
回复
void InteEncode(unsigned char* orginalData,int dataLength,int mode,int* endataLen,unsigned char* all_encoded_data)
{
short data[BLOCKL_MAX];
short encoded_data[ILBCNOOFWORDS_MAX];

int len;//encoded_dataLength = 0;
iLBC_Enc_Inst_t Enc_Inst;

initEncode(&Enc_Inst, mode);

while(dataLength>=Enc_Inst.blockl)
{
memcpy(data,orginalData,sizeof(short)*Enc_Inst.blockl);

dataLength -= Enc_Inst.blockl;
orginalData += Enc_Inst.blockl;
len=encode(&Enc_Inst, encoded_data, data);
memcpy(all_encoded_data,encoded_data,sizeof(unsigned char)*len);
all_encoded_data +=sizeof(unsigned char)*len;
*endataLen +=sizeof(unsigned char)*len;
}
memcpy(data,orginalData,sizeof(short)*dataLength);
len=encode(&Enc_Inst, encoded_data, data);
memcpy(all_encoded_data,encoded_data,sizeof(unsigned char)*len);
*endataLen +=sizeof(unsigned char)*len;


}

orginalData为存储需要压缩的原始数据
dataLength为需要压缩的原始数据长度
all_encoded_data为存储压缩后的数据
endataLen为压缩后数据的长度


这是我改写后的函数,编译没问题,执行却出错.
mibo2 2007-08-22
  • 打赏
  • 举报
回复
void iLBCMain(int argc,char* argv[])
{

FILE *ifileid,*efileid;
short data[BLOCKL_MAX];
short encoded_data[ILBCNOOFWORDS_MAX];
int len;
short mode;

iLBC_Enc_Inst_t Enc_Inst;

mode=atoi(argv[1]);

if ( (ifileid=fopen(argv[2],"rb")) == NULL)
{
fprintf(stderr,"Cannot open input file %s\n", argv[2]);
exit(2);
}
if ( (efileid=fopen(argv[3],"wb")) == NULL)
{
fprintf(stderr, "Cannot open encoded file %s\n",
argv[3]); exit(1);
}

initEncode(&Enc_Inst, mode);

while (fread(data,sizeof(short),Enc_Inst.blockl,ifileid)==Enc_Inst.blockl)
{
len=encode(&Enc_Inst, encoded_data, data);

fwrite(encoded_data, sizeof(unsigned char), len, efileid);

}
fclose(ifileid);
fclose(efileid);

}


原来的函数是这样的.

69,371

社区成员

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

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