NPK文件是DNF内置多媒体文件包,曾经用过EXRPG的大家都知道,NPK文件分为贴图NPK和音效NPK两种。贴图NPK内部包含若干IMG文件,而一个IMG文件则由若干个经过压缩的图片文件构成,而NPK文件的其他部分则用由图片的各种属性数据、图片的相对位置以及校验位所构成;而音效NPK则包含若干OGG文件。

NPK文件结构

每个NPK文件由4部分构成:NPK文件头(红色框内),IMG文件索引(黄色框内),NPK校验位(蓝色框内),IMG文件序列(剩下的框内)。具体内容如下表所示:

NPK文件头

20个字节,包括NPK文件头字符串和内含IMG文件的个数

IMG文件索引表

IMG文件1索引

每个IMG文件索引占264字节,包括IMG文件在整个NPK文件的地址偏移量和所占大小,以及经过一种特殊算法加密后的名字。

IMG文件2索引

IMG文件3索引

NPK校验位

32个字节,使用SHA256算法用以对NPK文件的合法性进行校验。

IMG文件序列

IMG文件1

所有具体的IMG文件组成的集合。

IMG文件2

IMG文件3

1.    NPK文件头

NPK文件头共20字节,包含一个16字节的固定的文件头字符串“NeoplePack_Bill”以及4字节的IMG文件的数目。

2.    IMG文件索引表

IMG文件索引表由若干个IMG文件索引数据首尾相接构成,每个IMG文件索引有264字节,其中包含了该NPK文件中每个IMG文件的地址偏移量,所占大小和加密后的名称,在提取IMG文件时,可以直接根据对应的索引表来直接获取地址和大小,然后进行读取操作。

IMG文件索引表的结构如下所示:

地址偏移量

4字节,地址偏移量

IMG文件大小

4字节,表示对应IMG文件的大小

IMG文件名称

256字节,IMG文件加密后的名称。

IMG文件名加密方法为:文件名原字符串转换为256字节的ASCII码(不足的以0填充),然后与256字节的字符串(注意最后一位是空格):

“puchikon@neople dungeon and fighterDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNFDNF”

的ASCII码进行按位异或运算。当然,解密和加密算法是一样的。

3.    NPK文件校验位

当NPK文件里包含至少1个IMG文件时,NPK文件在IMG文件索引表的后边设置32字节的校验位。校验位根据其之前的所有内容(即NPK文件头和IMG文件索引表)的字节流的前17的整数倍,进行SHA256加密。

C++没有内置的SHA256加密算法,网上有很多开源库可供下载(https://code.csdn.net/snippets/2538665)。

NPK文件校验位在NPK中具有极其重要的位置,当一个NPK文件的校验位不匹配时,DNF游戏将视其为一个无效的NPK文件,从而不会读取该NPK文件内的资源。

4.    IMG文件序列

IMG文件序列由NPK文件中所包含IMG文件数据首尾拼接而成,每个IMG文件的大小不是确定的,但是可以通过读取对应的IMG文件索引表来确定每一个IMG文件的起始位置和大小,从而读取整个IMG文件。IMG文件的详细格式见后续介绍。

关于DNF的多媒体包NPK文件的那些事儿(1)相关推荐

  1. linux软件安装之详解apt、yum、dnf 和 pkg包安装

    介绍 包管理系统除了安装软件外,它还提供了工具来更新已经安装的包.包存储库有助于确保你的系统中使用的代码是经过审查的,并且软件的安装版本已经得到了开发人员和包维护人员的认可. 在配置服务器或开发环境时 ...

  2. 解决springboot读取jar包中文件的问题

    解决springboot读取jar包中文件的问题 参考文章: (1)解决springboot读取jar包中文件的问题 (2)https://www.cnblogs.com/songxiaotong/p ...

  3. 【Android 热修复】热修复原理 ( 修复包 Dex 文件准备 | Dex 优化为 Odex | Dex 文件拷贝 | 源码资源 )

    文章目录 一.修复包 Dex 文件准备 二.Odex 优化 三.Dex 文件拷贝 四. 源码资源 一.修复包 Dex 文件准备 异常代码 : 故意写一个异常代码 , 并执行该代码 , 肯定会崩溃 ; ...

  4. ear包目录_Java中的JAR/EAR/WAR包的文件夹结构说明(转)

    JAR包:打成JAR包的代码,一般作为工具类,在项目中,会应用到N多JAR工具包. WAR包:JAVA WEB工程,都是打成WAR包,进行发布,如果我们的服务器选择TOMCAT等轻量级服务器,一般就打 ...

  5. linux查看jar包内容命令,【达内Java教程】用linux查看jar包内文件命令

    深圳java培训(sz.java.tedu.cn)专家教你用linux查看jar包内文件命令 jar vtf fileName.jar 用法: jar {ctxui}[vfm0Me] [jar-fil ...

  6. 读取jar包所在目录和jar包内文件

            在网上查找了很多关于读取jar包的相对路径资料,但是大多都是读取jar包内文件的方法介绍,甚至有人将读取包内路径的方法混淆为读取包外路径的方法.经过本人亲自的测试,对于两种读取文件的方 ...

  7. war包里面文件的修改方式

    war包里面文件的修改方式 1 将war包移动到一个干净的路径下,使用 jar xvf ROOT.war 命令将war进行解压操作 2 修改相应的文件内容,修改想要修改的文件,比如web.xml 3 ...

  8. python读取压缩文件的大小_python查看zip包中文件及大小的方法

    python查看zip包中文件及大小的方法 本文实例讲述了python查看zip包中文件及大小的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python import ...

  9. java jar包资源文件_深入jar包:从jar包中读取资源文件

    我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...

  10. 2-SII--应用本包下文件写入和读取

    零.先说一下我的IO小工具方法: 1.IO读写: IO.png 2.读取InputStream /*** 读取InputStream** @param is 输入流* @return 流转化的字符串* ...

最新文章

  1. 【跟着我们学Golang】之异常处理
  2. CentOS7下vsftp配置
  3. Ubuntu 修改时区和时间
  4. 一个不错的git学习网站
  5. Ansible基础入门
  6. Python入门100题 | 第042题
  7. Python编程:Tkinter图形界面设计(2)
  8. 25个出众的Web表单范例
  9. escape、encodeURI 、encodeURIComponent 编码与解码
  10. html长图滚动,Axure教程:长页或长图滚动效果
  11. [Kubernetes] 在K8S上部署MySQL 8.0并数据持久化
  12. SAP License:SAP Business One 与SAP R/3的区别
  13. python config模块_用Python内置模块处理ini配置文件
  14. Python判断字符类型
  15. 移动医疗的服务怎么做?来听听传统医疗器械厂商怎么说
  16. Magento网店自定义模板初探(1)——文件夹结构
  17. c# log4net
  18. 一个方便快捷gif在线水印制作(支持文字和图片)
  19. [Netlist29-358] Reg ‘Counter[7]‘ of type ‘FDCPE’ cannot be timed accurately. Hardwarebehavior may be
  20. CityEngine中如何导出带有属性信息的slpk

热门文章

  1. 24. cc.Director与资源加载策略
  2. Echarts中使用china.js
  3. PMP考试今年改革吗?
  4. 结构力学计算软件_辽宁网格修复软件价格如何
  5. 车位编号lisp_cad自动编号插件
  6. 用SIR模型处理新冠疫情
  7. 金蝶K3 对接(直接操作数据库)
  8. 淘淘商城简介——淘淘商城(一)
  9. LG GPRO2 SudaMod 3.1 自编译版 20180524 更新
  10. DSOframer 微软官方API的查阅方法