岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Java >> J2ME >> 无线开发 >> Java正文
J2me技术——跟我学制作Pak文件
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-22 22:54:51

  序言:
  
  由于前些时间,一些matrixer常问关于j2me中使用Pak文件的问题。本人虽学艺不深,但满怀热心的做了一番探索,现将制作Pak文件的看法和方法公布出来,大家多多提意见。
  
  一、什么是Pak文件
  
  Pak文件就是将多个文件打包为一个单独文件,在这个文件中保存着多个文件的数据,当然还有一些描述文件结构的数据。所以将“Pak”作为文件的后缀是一种常规的用法,大家可以自定义其它的文件后缀。
  
  二、为什么使用Pak文件:
  
  由于MIDP对发布安装的j2me程序大小进行了限制,所以缩小发布程序就意味着能够提供更多的程序或者内容(如图片、音乐)给用户。而通过研究发现zip/jar算法对大文件的压缩率高于对等量的多个小文件的压缩率。
  
  当然还有其它方法,这里简单做一下讨论比如使用混淆器ProGuard的“-overloadaggressively”选项使jar文件缩小,但也会导致一些错误,因为这种方法生成jar中的class符合java byte code标准,但是与java语法相悖,严重的可能造成一些jre对Object的序列化错误。
  
  所以使用Pak方法将程序中要用到的资源(图片、音乐、文本)组合为单一文件是一个安全有效的方法。而且对于一些商用程序,完全可以在pak文件中对文件数据进行加密,很好的保护了作者和公司的权益。本人的sample中使用了简单的“加减法”加密,对于手机这类设备来讲是一个效率较高的选择。
  
  三、Pak文件的结构:
  
  大家可以自己设计Pak文件结构,本人这里只是抛砖引玉的作个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位整数
  
  Concatenated File Data:按File Table的顺序连接在一起的文件数据。
  * 文件数据
  
  四、程序框架:
  
  说明:由于Pak文件的制作和使用分别要使用两个java应用领域:j2se和j2me,所以本人将PakUtil类制作了2个版本(j2se和j2me)。
  
  程序框架如下:
  1。PakHeader类,定义了Pak文件头。
  2。PakFileTable类,定义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;/** * 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;
  //定义加法运算
  public static final int ADDITION_CIPHERACTION=0;
  //定义减法运算
  public static final int SUBTRACT_CIHOERACTION=1;
  //文件签名
  private char[] signature=new char[SIGNATURE_LENGTH];
  //版本号
  private float version=0f;
  //文件table数量
  private long numFileTableEntries=0;
  //密码使用方法:在原数据上进行加法还是减法
  private byte cipherAction=ADDITION_CIPHERACTION;
  //密码值
  private byte cipherValue=0x00;
  //唯一ID
  private char[] uniqueID=new char[UNIQUEID_LENGTH];
  //保留的4字节
  private long reserved=0;
  public PakHeader(){
  }
  /**
  * 构造方法
  * @param signature 签名
  * @param version 版本
  * @param numFileTableEntries 文件table数量
  * @param cipherAction 密码使用方法
  * @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 i=0;i<SIGNATURE_LENGTH;this.signature[i]=signature[i],i++)
  ;
  this.version=version;
  this.cipherAction=cipherAction;
  this.numFileTableEntries=numFileTableEntries;
  this.cipherValue=cipherValue;
  for(int i=0;i<UNIQUEID_LENGTH;this.uniqueID[i]=uniqueID[i],i++);
  this.reserved=reserved;
  }        
  public byte getCipherValue() {
  return cipherValue;    
  }
  public void setCipherValue(byte cipherValue) {
  this.cipherValue = cipherValue;
  

[1] [2] [3] [4] [5] [6] [7] [8] 下一页


  • 上一个Java:
  • 下一个Java:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    传世私服 传奇世界私服 天龙八部私服 bet365 传世私服 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365