zoukankan      html  css  js  c++  java
  • [C语言] 文件操作,解压华为官方固件UNDATE.APP工具(源代码);

    /*
     * =====================================================================================
     *
     *       Filename:  unpack.c
     *
     *    Description:  仅作为代码分享,转载请注明作者
    *          (相对于把整大块文件读入内存,此程序运行时对系统开销比较小的特点); * * Version: 1.0 * Created: 2013年03月28日 22时34分52秒 * Revision: none * Compiler: gcc * * Author: linkscue (scue), * Organization: * * =====================================================================================
    */ #include <stdlib.h> #include <stdio.h> #include <strings.h> #define u8 unsigned char #define u32 unsigned int #define u16 unsigned short #define BUFFER_SIZE 4 /* * u32 magic * u32 paket_size * u32 flag=0x1 * u8 Hardware[8] * u32 Filetype * u32 data_size * u8 date[16] * u8 time[16] * u8 filename[32] * u8 other[paket_size-92] * */ int realStrlen(char *string){ int i=0; char ch=NULL; while ( (ch = *(string + i)) != '\xFF' ) { i++; } return i; } void hello(){ printf("\n"); printf("Welcome to use linkscue unpack huawei official rom tool!\n"); } int main ( int argc, char *argv[] ) { hello(); if (argc == 1) { printf("\n"); printf("usage: %s unpack.app\n", argv[0]); exit(0); } char *file; FILE *fp,*fd; u32 tmp; u32 magic=0xa55aaa55; u32 paket_size=0; u32 flag=1; u8 hwid[8]=""; u32 filetype=0; u32 data_size=0; u8 date[16]=""; u8 time[16]=""; u8 filename[32]=""; int other_size=0; int number=1; char basename[32]=""; char basehwid[8]=""; int fp_start=0; int fp_local=0; int i=0,count=0,counts=0; int end_point=0; file=argv[1]; if ( (fp=fopen(file,"rb")) == NULL) { printf("open file failure!\n",file); exit(1); } printf("\n"); while (!feof(fp)) { fscanf(fp, "%4c", &tmp); if (tmp == magic) { fp_start=(ftell(fp)-4); fscanf(fp, "%4c",&paket_size); fscanf(fp, "%4c",&flag); fscanf(fp, "%8c",&hwid); fscanf(fp, "%4c",&filetype); fscanf(fp, "%4c",&data_size); fscanf(fp, "%16c",&date); fscanf(fp, "%16c",&time); fscanf(fp, "%32c",&filename); other_size=( paket_size - 92 ); fseek(fp, other_size, SEEK_CUR); if ( strcmp(filename,"INPUT") == 0 ) { sprintf(basename, "output_%02d.img", number); strncpy(filename, basename, sizeof(filename)); number++; } // if ( (int)paket_size <= 0 || (int)data_size <= 0) { // continue; // } strncpy(basehwid, hwid , realStrlen(hwid)); printf("At: 0x%08x hw: %s size: %-10d time: %s_%s --> %s\n", fp_start, basehwid, data_size, date, time, filename); if ((fd=fopen(filename,"wb"))==NULL) { printf("open %s to write data failure!\n", filename); fseek(fp, 88, SEEK_CUR); continue; } u8 buffer[BUFFER_SIZE]; counts = 0; while ( counts < data_size ){ if (feof(fp)) { /* if the file is end, break! */ break; } count = fread(buffer, 1, BUFFER_SIZE, fp); fwrite(buffer, 1 , BUFFER_SIZE, fd); counts+=count; } // printf("paket size is 0x%08x, count is %d, data start at 0x%08x, this time end at 0x%08x\n", paket_size,counts, (paket_size+fp_start), ftell(fp)); fclose(fd); fseek(fp, ( fp_start + 92 ) , SEEK_SET); } } // printf("Unpack %s ok!\n", file); fclose(fp); return EXIT_SUCCESS; }

    ------------
    微博:http://weibo.com/scue
    Github:http://github.com/scue
  • 相关阅读:
    RecyclerView 数据刷新的几种方式 局部刷新 notify MD
    【图片】批量获取几万张图片
    RV BaseRecyclerViewAdapterHelper 总结 MD
    RecyclerView.ItemDecoration 间隔线
    Kotlin【简介】Android开发 配置 扩展
    Kotlin 特性 语法糖 优势 扩展 高阶 MD
    一个十分简洁实用的MD风格的UI主框架
    折叠伸缩工具栏 CollapsingToolbarLayout
    FloatingActionButton FAB 悬浮按钮
    Glide Picasso Fresco UIL 图片框架 缓存 MD
  • 原文地址:https://www.cnblogs.com/scue/p/2988034.html
Copyright © 2011-2022 走看看