IOS 文件解析

  1 import java.io.BufferedInputStream;
  2 import java.io.File;
  3 import java.io.FileInputStream;
  4 import java.io.IOException;
  5 import java.io.InputStream;
  6 import java.io.StringReader;
  7 import java.util.ArrayList;
  8 import java.util.HashMap;
  9 import java.util.List;
 10 import java.util.zip.ZipEntry;
 11 import java.util.zip.ZipFile;
 12 import java.util.zip.ZipInputStream;
 13
 14 import org.apache.commons.lang.StringUtils;
 15 import org.apache.poi.util.IOUtils;
 16 import org.dom4j.Document;
 17 import org.dom4j.DocumentException;
 18 import org.dom4j.Element;
 19 import org.dom4j.io.SAXReader;
 20 import org.w3c.dom.Node;
 21 import org.xml.sax.InputSource;
 22
 23
 24 /**
 25  * IOS文件解析
 26  *
 27  * @author     dKF63325
 28  * @version    ONIP BME V300R001 2014-6-9
 29  * @since      ONIP BME V300R001C00
 30  */
 31 public class IosInfoUtils
 32 {
 33
 34
 35     public static HashMap<String, Object> getIosInfo(String filePath, String fileName) throws Exception
 36     {
 37         // 获得二级目录名称
 38         String appName = getAppName(filePath);
 39
 40         // 解析文件
 41         HashMap<String, Object> infoMap = parseXml(filePath, appName);
 42
 43         File file = new File(filePath);
 44         // 文件名称
 45         infoMap.put("fileName", file.getName());
 46         // 文件大小
 47         infoMap.put("fileSize", convertFileSize(file.length()));
 48         // 文件大小(单位:字节)
 49         infoMap.put("fileByteSize", file.length());
 50         // 是否存在SDK
 51         infoMap.put("isSDK", AXMLPrinter2.isExistsSdkFromIOS(filePath, appName));
 52         // SDK版本号
 53         infoMap.put("sdkVersion", AXMLPrinter2.getSdkVersionFromIOS(filePath, appName));
 54
 55         return infoMap;
 56     }
 57
 58     private static String getAppName(String filePath)
 59     {
 60         ZipFile file = null;
 61         InputStream in = null;
 62         String name = StringUtils.EMPTY;
 63         try
 64         {
 65             in = new BufferedInputStream(new FileInputStream(filePath));
 66             ZipInputStream zip = new ZipInputStream(in);
 67             ZipEntry zp = null;
 68             while ((zp = zip.getNextEntry()) != null)
 69             {
 70                 name = zp.getName();
 71                 if (name.indexOf(".app") != -1)
 72                 {
 73                     name = name.substring(name.indexOf("Payload/")+"Payload/".length(), name.indexOf(".app") + ".app".length());
 74                     break;
 75                 }
 76             }
 77         }
 78         catch (IOException e)
 79         {
 80             DEBUGGER.error("Failed to getAppName", e);
 81         }
 82         finally
 83         {
 84             IOUtils.closeQuietly(in);
 85             AXMLPrinter2.closeZipFile(file);
 86         }
 87         return name;
 88     }
 89
 90     private static HashMap<String, Object> parseXml(String filePath, String projectName) throws IOException, Exception, DocumentException
 91     {
 92         String xml = AXMLPrinter2.getXmlFromIOS(filePath, projectName);
 93         StringReader read = new StringReader(xml);
 94         InputSource scource = new InputSource(read);
 95         SAXReader sax = new SAXReader();
 96         sax.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
 97         Document root = sax.read(scource);
 98         Element dictElement = (Element) root.selectSingleNode("//dict");
 99         List<Element> children = filterElement(dictElement.elements());
100         HashMap<String, Object> infoMap = new HashMap<String, Object>();
101         for (int i = 0; i < children.size(); i+=2)
102         {
103             Element key = children.get(i);
104             Element val = children.get(i+1);
105             if ("array".equals(val.getName()))
106             {
107                 List<Element> arrayList = filterElement(val.elements());
108                 String values = StringUtils.EMPTY;
109                 for (Element element : arrayList)
110                 {
111                     values += element.getStringValue() + ",";
112                 }
113                 infoMap.put(key.getStringValue(), StringUtils.removeEnd(values, ","));
114             } else if ("true".equals(val.getName())) {
115                 infoMap.put(key.getStringValue(), true);
116             } else if ("false".equals(val.getName())) {
117                 infoMap.put(key.getStringValue(), false);
118             } else {
119                 infoMap.put(key.getStringValue(), val.getStringValue());
120             }
121         }
122         return infoMap;
123     }
124
125     private static List<Element> filterElement(List<?> elements) {
126         List<Element> result = new ArrayList<Element>(elements.size());
127         for (Object object : elements)
128         {
129             Element element = (Element)object;
130             if (element.getNodeType() == Node.ELEMENT_NODE)
131             {
132                 result.add(element);
133             }
134         }
135         return result;
136     }
137
138     public static String convertFileSize(long filesize)
139     {
140         String strUnit = "Bytes";
141         String strAfterComma = "";
142         int intDivisor = 1;
143         if (filesize >= 1024 * 1024)
144         {
145             strUnit = "MB";
146             intDivisor = 1024 * 1024;
147         } else if (filesize >= 1024)
148         {
149             strUnit = "KB";
150             intDivisor = 1024;
151         }
152         if (intDivisor == 1){
153             return filesize + " " + strUnit;
154         }
155
156         strAfterComma = "" + 100 * (filesize % intDivisor) / intDivisor;
157         if (strAfterComma.equals(""))
158             strAfterComma = ".0";
159
160         return filesize / intDivisor + "." + strAfterComma + " " + strUnit;
161     }
162 }
时间: 2024-10-13 06:38:55

IOS 文件解析的相关文章

iOS开发网络多线程之网络请求文件解析

一.网络请求 1. get请求 1> 确定URL 2> 创建请求 3> 发送连接请求(网络请求用异步函数) - (void)get {    // 1.url    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];        // 2.请求    NSURLRequest *reque

iOS xml解析

iOS xml 解析方法有两种:SAX , DOM. SAX 不用借助第三方,在解析过程中逐行解析.(NSXMLParser,需要实现代理),具体步骤: 1.获取文件路径. 2.创建 NSXMLParser 对象. 3.遵守协议,设置代理. 4.实现代理方法 1>- (void)parserDidStartDocument:  ---- 开始解析 2>- (void)parserDidEndDocument: ----解析结束 3>- (void)parser:didStartEleme

NSObject头文件解析 / 消息机制 / Runtime解读 (一)

NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface ClassA : NSObject @end 那么NSObject里面具体有什么呢? 我们点到它的头文件里面去看看 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; //每个NSObject对象都拥有一个Class类作为成员

iOS 基础类解析 - NSString

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 以下从苹果官网摘录的 NSString 的目录信息,大家发现了,条目太多,不过看一下分类,一共24个,好像少很多了吧,就是这样,理解了每一个分类所

iOS中解析 XML / JSON

JSON数据格式 1. 概述: JSON (JavaScript Object Notation) 是?一种轻量级的数据交换格式 基于?文本格式,易于?人阅读和编写,同时也易于机器解析和?生成. 2. JSON 数据的书写格式是:名称/值 • 名称写在前?面(在双引号中) • 值对写在后?面 • 中间?用冒号隔开 3. JSON 值?支持类型 数字(整数或浮点数) 字符串(在双引号中) 逻辑值(true 或 false) 数组(在中括号中) 对象(在花括号中) null JSON格式?一:最外层

Intel HEX文件解析

近期有一个需求就是为Arduino开发板做一个基于蓝牙的无线烧录程序.眼下的Arduino程序都是通过USB线连接到电脑的主机上,实际的传输过程是基于USB协议的,这个过程还是比較麻烦的.由于每次的编译完以后都须要通过一个USB线来完毕传输烧录的工作,这个还是非常麻烦的. 原理解读 在Arduino中.利用USB来完毕传输烧录大概是这么一个过程. 每一个Arduino源程序.即sketch文件,经过一系列的编译处理以后.终于会形成一个Intel HEX格式的文件.这个HEX文件事实上就一个被封装

AndroidNative层文件解析漏洞挖掘指南

| 导语 本文以手Q的一次文件解析类漏洞挖掘为例,叙述了Android Native层文件解析类型漏洞挖掘的过程 手Q这个应用从功能来说十分的庞大,如果使用类似MFFA的框架去挖掘文件解析类漏洞,效率低,而且文件入口在哪儿.如何利用脚本进行自动化都是非常大的问题.本文在一次手Q的文件解析类漏洞挖掘的过程中,提出了一种可能的解决问题的方案,妄称指南不吝赐教. 目录: 1.问题分析 2.流程图 3.so筛选 4.测试程序编写 5.test case生成 6.测试得出crash 7.未来的工作 0x0

Atitit。Tree文件解析器的原理流程与设计实现&#160;&#160;java&#160;&#160;c#&#160;php&#160;js

Atitit.Tree文件解析器的原理流程与设计实现  java  c# php js 1. 解析原理与流程1 1.1. 判断目录  ,表示服  dirFlagChar = "└├─";1 1.2. 剑豪制表符出现的位置与文件夹级别对应表1 1.3. 主要判读流程2 2. Tree结果2 3. Code----3 4. 结果5 1. 解析原理与流程 1.1. 判断目录  ,表示服  dirFlagChar = "└├─"; 其中-类似于剑豪的制表符是表示目录的..够

基于Android2.3.5系统:Android.mk文件解析

*************************************************************************************************************************** 作者:EasyWave                                                                                                               时间:2