69,373
社区成员
发帖
与我相关
我的任务
分享
//返回值 0:失败 1:成功
int fill_bin_file(char *filename,unsigned char file_data,long size)
{
FILE *fp;
long cur_size;
unsigned char val;
int j;
//============打开文件
fp = fopen(filename,"rb+");
if (fp == NULL)
{
printf("open file fail\n");
return 0;
}
//==========获取文件的当前长度
if (fseek(fp,0,SEEK_END)!=0)
{
printf("seek file fail\n");
fclose(fp);
return 0;
}
cur_size = ftell(fp);
//==========校验文件长度
if ((cur_size == -1)||(cur_size+32 >= size))
{
printf("get file size fail\n");
fclose(fp);
return 0;
}
printf("file current size is : %u\n",cur_size);
//=========计算从文件开始到当前位置的异或校验
crc_val = 0;
j=0;
if (fseek(fp,0,SEEK_SET)!=0)
{
printf("seek file fail\n");
fclose(fp);
return 0;
}
while(j<cur_size)
{
if (fread(&val,1,1,fp)!=1)
{
printf("read file error\n");
fclose(fp);
return 0;
}
crc_val ^= val;
j++;
}
//===========填充文件
while (cur_size < size-32)
{
if(fwrite(&file_data,1,1,fp)!=1)
{
printf("write file fail\n");
fclose(fp);
return 0;
}
cur_size++;
crc_val ^= file_data;
}
//==========填写后缀信息
//填写程序名
for (j=0;j<10;j++)
{
fwrite(&dev_type[j],1,1,fp);
cur_size++;
crc_val ^= dev_type[j];
}
//填写版本
for (j=0;j<10;j++)
{
fwrite(&version[j],1,1,fp);
cur_size++;
crc_val ^= version[j];
}
//填写保留
for (j=0;j<11;j++)
{
fwrite(&file_data,1,1,fp);
cur_size++;
crc_val ^= file_data;
}
//填写校验
fwrite(&crc_val,1,1,fp);
fclose(fp);
return 1;
}