首页 > [C语言] 文件操作,解压华为官方固件UNDATE.APP工具(源代码);

[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 #include #include #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(" ");printf("Welcome to use linkscue unpack huawei official rom tool! "); } int main ( int argc, char *argv[] ) {hello();if (argc == 1) {printf(" ");printf("usage: %s unpack.app ", 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! ",file);exit(1);}printf(" ");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 ", fp_start, basehwid, data_size, date, time, filename);if ((fd=fopen(filename,"wb"))==NULL) {printf("open %s to write data failure! ", 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 ", paket_size,counts, (paket_size+fp_start), ftell(fp)); fclose(fd);fseek(fp, ( fp_start + 92 ) , SEEK_SET);}} // printf("Unpack %s ok! ", file); fclose(fp);return EXIT_SUCCESS; }

 

更多相关:

  • 1. 定义网络的基本参数 定义输入网络的是什么: input = Input(shape=(240, 640, 3)) 反向传播时梯度下降算法 SGD一定会收敛,但是速度慢 Adam速度快但是可能不收敛 [link](https://blog.csdn.net/wydbyxr/article/details/84822806...

  • size_t和int       size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。 在32位架构中被普遍定义为: typedef   unsigned int size_t; 而在64位架构中被定义为: typedef  unsigned lo...

  • 我在 https://blog.csdn.net/wowricky/article/details/83218126 介绍了一种内存池,它的实现类似于linux 中打开slub_debug (1. make menuconfig: Kenel hacking -> Memory Debugging, 2. comand line中传入...

  • 项目开发中需要从引擎 获取一定范围的数据大小,用作打点上报,测试过程中竟然发现写入了一部分数据之后通过GetApproximateSizes 获取写入的key的范围时取出来的数据大小竟然为0。。。难道发现了一个bug?(欣喜) 因为写入的数据是小于一个sst的data-block(默认是4K),会不会因为GetApproximate...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...