2022年PAK文件制作 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年PAK文件制作 .pdf》由会员分享,可在线阅读,更多相关《2022年PAK文件制作 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、什么是Pak 文件:Pak 文件就是将多个文件打包为一个单独文件,在这个文件中保存着多个文件的数据,当然还有一些描述文件结构的数据。所以将“Pak”作为文件的后缀是一种常规的用法,大家可以自定义其它的文件后缀。二、为什么使用Pak 文件:由于 MIDP 对发布安装的j2me 程序大小进行了限制,所以缩小发布程序就意味着能够提供更多的程序或者内容(如图片、音乐)给用户。而通过研究发现zip/jar 算法对大文件的压缩率高于对等量的多个小文件的压缩率。当 然 还 有 其 它 方 法 , 这 里 简 单 做 一 下 讨 论 比 如 使 用 混 淆 器PRoGuard的“-overloadaggr
2、essively ”选项使 jar 文件缩小,但也会导致一些错误,因为这种方法生成jar中的 class符合 java byte code 标准,但是与 java 语法相悖, 严重的可能造成一些jre 对 Object的序列化错误。所以使用 Pak 方法将程序中要用到的资源(图片、音乐、 文本) 组合为单一文件是一个安全有效的方法。而且对于一些商用程序,完全可以在pak 文件中对文件数据进行加密,很好的保护了作者和公司的权益。本人的sample 中使用了简单的“加减法”加密,对于手机这类设备来讲是一个效率较高的选择。三、 Pak 文件的结构:大家可以自己设计Pak 文件结构,本人这里只是抛砖引
3、玉的作个sample。下面就是本人设计的 Pak 文件结构:PAK File Header :Pak 文件的头部* 签名: 6 字节 char 数组* 版本号: 32 位 float * 文件 table 数量: 32 位整数* 密码行为: 8 位字节* 密码: 8 位字节* 文件唯一ID :10 字节 char 数组* 保留位: 32 位整数 (4字节 ) File Table:Pak 文件中包含文件的列表,在一个Pak 文件中一个被包含的文件对应一个File Table。* 文件名: 30 字节 char 数组* 文件大小: 32 位整型* 文件在 pak 文件中的位移:32 位整数Con
4、catenated File Data:按 File Table 的顺序连接在一起的文件数据。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - * 文件数据四、程序框架:说明:由于Pak 文件的制作和使用分别要使用两个java 应用领域: j2se 和 j2me,所以本人将 PakUtil 类制作了2 个版本( j2se 和 j2me) 。程序框架如下:1。PakHeader 类,定义了Pak 文件头。2。PakFileTabl
5、e 类,定义Pak 文件 table。3。PakUtil 类( j2se 版) ,具备两个功能:将多个png 图片合成一个Pak 文件,并使用简单的加减加密法对其进行加密;从Pak 文件中取出png 图片,构造byte 数组(可以用来构造 Image 对象)或者写为文件。PakUtil 类(j2me 版) ,具备的功能: 从 Pak 文件中取出png 图片,构造 byte 数组(可以用来构造Image 对象) 。五、 PakHeader和 PakFileTable 类:PakHeader.java:package cn.org.matrix.gmatrix.gameLab.util.pak;/
6、* * Pak文件头:* 结构:* 签名: 6 字节 char 数组* 版本号: 32 位 float * 文件 table 数量: 32 位整数* 密码行为: 8 位字节* 密码: 8 位字节* 文件唯一ID:10 字节 char 数组* 保留位: 32 位整数 (4字 节 ) * author cleverpig * */class PakHeader / 定 义 文 件 唯一ID长 度public static final int UNIQUEID_LENGTH=10; /定义文件签名长度public static final int SIGNATURE_LENGTH=6; /定义加法运
7、算public static final int ADDITION_CIPHERACTION=0; / 定 义 减 法 运 算public static final int SUBTRACT_CIHOERACTION=1; /文件签名private char signature=new charSIGNATURE_LENGTH; /版本号private float version=0f; /文件 table 数量private long numFileTableEntries=0; /密码使用方法: 在原数据上进行加法还是减法private byte cipherAction=ADDITION
8、_CIPHERACTION; /密码值private byte cipherValue=0 x00; /唯一 ID private char uniqueID=new charUNIQUEID_LENGTH; / 保 留 的4字 节private long reserved=0; public PakHeader() /* * 构造方法* param signature 签名* param version 版本* param numFileTableEntries 文件 table 数量* param cipherAction 密码使用方法名师资料总结 - - -精品资料欢迎下载 - - -
9、- - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - * param cipherValue 密码值* param uniqueID 唯一 ID * param reserved 保留的 2字节*/ public PakHeader(char signature,float version, long numFileTableEntries,byte cipherAction, byte cipherValue,char uniqueID, long reserved) for(int
10、 i=0;iSIGNATURE_LENGTH;this.signaturei=signaturei,i+) ; this.version=version; this.cipherAction=cipherAction; this.numFileTableEntries=numFileTableEntries; this.cipherValue=cipherValue; for(int i=0;iUNIQUEID_LENGTH;this.uniqueIDi=uniqueIDi,i+) ; this.reserved=reserved; public byte getCipherValue() r
11、eturn cipherValue; public void setCipherValue(byte cipherValue) this.cipherValue = cipherValue; public long getNumFileTableEntries() return numFileTableEntries; public void setNumFileTableEntries(long numFileTableEntries) this.numFileTableEntries = numFileTableEntries; public long getReserved() retu
12、rn reserved; public void setReserved(long reserved) this.reserved = reserved; public char getUniqueID() return uniqueID; public void setUniqueID(char uniqueID) for(int i=0;iUNIQUEID_LENGTH;this.uniqueIDi=uniqueIDi,i+) ; public float getVersion() return version; public void setVersion(float version)
13、this.version = version; public byte getCipherAction() return cipherAction; public void setCipherAction(byte cipherAction) this.cipherAction = cipherAction; public char getSignature() return signature; public void setSignature(char signature) for(int i=0;iSIGNA TURE_LENGTH;this.signaturei = signature
14、i,i+) ; /* * 返回PakHeader 的大小* return 返回PakHeader 的大小*/ public static int size() return SIGNATURE_LENGTH+4+4+1+1+UNIQUEID_LENGTH+4; public String toString() String result=; result+=t 签名 :+new String(this.signature).trim() +t 版本号 :+this.version +t 文件 table 数量 :+this.numFileTableEntries +t 密码行为 : +this
15、.cipherAction +t密 码 :+this.cipherValue +t文件唯一ID:+new String(this.uniqueID).trim() +t保留位 :+this.reserved; return result; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - PakFileTable.java package cn.org.matrix.gmatrix.gameLab.util.pak;/* * P
16、ak 文件 table 类 * 文件 table 结构:* 文件名: 30 字节 char 数组* 文件大小: 32 位整型* 文件在 pak 文件中的位移: 32 位整数* author cleverpig * */class PakFileTable public static final int FILENAME_LENGTH=30; / 文 件 名private char fileName=new charFILENAME_LENGTH; /文件大小private long fileSize=0L; /文件在pak 文件中的位移private long offSet=0L; publi
17、c PakFileTable() /* * 构造方法* param fileName 文件名* param fileSize 文件大小* param offSet 文件在Pak文 件 中 的 位 移*/ public PakFileTable(char fileName, long fileSize,long offSet) for(int i=0;iFILENAME_LENGTH;this.fileNamei=fileNamei,i+) ; this.fileSize=fileSize; this.offSet=offSet; public char getFileName() return
18、 fileName; public void setFileName(char fileName) for(int i=0;ifileName.length;this.fileNamei=fileNamei,i+) ; public long getFileSize() return fileSize; public void setFileSize(long fileSize) this.fileSize = fileSize; public long getOffSet() return offSet; public void setOffSet(long offSet) this.off
19、Set = offSet; /* * 返回文件Table 的大小* return 返回文件Table 的大小*/ public static int size() return FILENAME_LENGTH+4+4; public String toString() return t 文件名 :+new String(this.fileName).trim() +t文 件 大 小 :+this.fileSize +t文 件 位移:+this.offSet; 六、 PakUtil 类( j2se 版) :PakUtil.java package cn.org.matrix.gmatrix.ga
20、meLab.util.pak;import java.io.*;import java.util.Vector;/* * Pak工具类* 功能:* 1.将多个 png 图片合成一个Pak 文件,并使用简单的加减加密法对其进行加密;* 2.从 Pak 文件中取出png 图片,构造byte 数组(可以用来构造Image 对象)或者写为文件* author cleverpig * */public class PakUtil public PakUtil() /* * 返回文件长度* param filePath 文件路径* return 文件长度*/ private long getFileSiz
21、e(String filePath) File file=new File(filePath); return file.length(); /* * 返 回文件名* param filePath 文件路径* return 文件 名*/ private String getFileName(String filePath) File file=new File(filePath); return file.getName(); /* * 计 算 文 件 位 移 的 起 始 点* return 文 件 位 移 的 起 始 点*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - -
22、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - private long workOutOffsetStart(PakHeader header) /计算出文件头+文件table的长度return PakHeader.size()+header.getNumFileTableEntries()*PakFileTable.size(); /* * 计算文件位移* param fileIndex 文件序号* param lastFileOffset 上一个文件位移* return 文件在pak
23、文件中的位移*/ private long workOutNextOffset(long sourceFileSize,long lastFileOffset) return lastFileOffset+sourceFileSize; /* * 生成文件table * param sourceFileName 源文件名* param sourceFileSize 源文件长度* param currentFileOffset 当前文件位移* return 生 成 的PakFileTable对 象*/ private PakFileTable generateFileTable(String s
24、ourceFileName, long sourceFileSize,long currentFileOffset) PakFileTable ft=new PakFileTable(); ft.setFileName(sourceFileName.toCharArray(); ft.setFileSize(sourceFileSize); ft.setOffSet(currentFileOffset); return ft; /* * 将 char字符数组写入到DataOutputStream 中* param toWriteCharArray 被写入的 char 数组* param dos
25、 DataOutputStream * throws Exception */ private void writeCharArray(char toWriteCharArray,DataOutputStream dos) throws Exception for(int i=0;itoWriteCharArray.length;dos.writeChar(toWriteCharArrayi),i+); /* * 使用文件头中的密码对数据进行加密* param buff 被加密的数据* param buffLength 数据的长度* param header 文件头*/ private voi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年PAK文件制作 2022 PAK 文件 制作
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内