关于DNF的多媒体包NPK文件的那些事儿(4)- NPK文件操作流程
為了編程方便。將NPK文件流分為四個部分。
NPK文件解析的時候將流分割成四個部分存入對應的緩沖區;NPK文件修改時對四個部分直接進行物理修改;保存的時候只需要重新串起來就可以了。
因此一個NPK對象可以這么定義:邏輯值包括目錄(即IMG索引)、IMG個數;物理值包括四個數據流。
四個流命名為data1, data2, data3, data4,在對NPK進行讀取時不可變,對NPK進行修改時可變,用途如下:
data1:包含NPK頭的NeoplePack_Bill字符串以及包含img的個數。定長20字節。
data2:IMG目錄,包含IMG的所有索引項。長度為264字節×項數(即data1里img的個數)。
data3:NPK校驗位,為data1和data2加起來后前17字節的整數倍的SHA256校驗碼。定長32字節。
data4:IMG文件數據首尾相接構成的大數據流,占NPK文件的絕大部分。
修改NPK時一般的步驟如下:
1. 先修改邏輯值,即IMG個數以及目錄:
若涉及IMG插入與刪除操作,則IMG個數相應地增加或減少;
當IMG發生修改或者添加或減少的時候,先將輸入IMG索引項的三個參數(偏移量、大小、名字)確定,然后根據內部內容的變化,調整所有索引項內的偏移量。
2. 修改完邏輯值后,根據邏輯值調整物理值:
對data1,若IMG個數變化,則需要重寫(或者只修改最后4字節);
對data2,重寫(基本都要重寫);
對data3,根據data1、data2重新計算校驗碼;
對data4,需要在計算變動目錄項的偏移量時進行記錄,然后根據該記錄值來進行流的增刪。
下面列出幾個基本操作的處理流程。
1. 增加IMG(PUSH)
輸入:IMG對象(IMG文件流),IMG名字
處理方式:
a. 先生成一個索引項:偏移量 = NPK大小,大小 = IMG文件流大小,名字 = IMG名字;
b. 在目錄后插入這個索引項;
c. 因為目錄中增加了一個索引項,目錄內的索引項的偏移量都增加264個字節(等于一個IMG索引項的大小);
d. IMG數加1;
e. 重新計算data1、data2、data3;
f. data4文件后直接插入IMG文件流。
2. 插入IMG(INSERT)
輸入:插入位置pos(若插入位置為最后,則演變為PUSH,但PUSH不是INSERT的特例),IMG對象,IMG名字
處理方式:
a. 先生成一個索引項:偏移量 = 目錄在pos處索引項的偏移量,大小 = IMG文件流大小,名字 = IMG名字;
b. 將這個索引項的偏移量記錄下來,減去當前的data1、data2、data3的總長度之和,得到data4插入數據在data4內部的偏移量,記錄下來;
b. 在目錄的pos處插入這個索引項;
c. 因為目錄中增加了一個索引項,目錄內的索引項的偏移量都增加264個字節;
d. 目錄中pos處之后的索引項,偏移量增加IMG文件流的大小個字節;
e. IMG數加1;
f. 重新計算data1、data2、data3;
g. data4文件中,在b步驟所記錄下的偏移量處,插入IMG文件流。
3.刪除IMG(DELETE)
輸入:刪除位置pos
處理方式:
a. 生成一個索引項從目錄的pos處提取出來即可,其:偏移量 = 目錄在pos處索引項的偏移量,大小 = 目錄在pos處索引項的大小,名字不用管;
b. 記錄該索引項的偏移量,減去當前的data1、data2、data3的總長度之和,得到data4待刪除數據在data4內部的偏移量,記錄下來;
c. 在目錄處的pos處刪除這個索引項;
d. 因為在目錄中刪除了一個索引項,目錄內所有索引項的偏移量都減少264個字節;?
e. 目錄中pos處和pos處之后的索引項,偏移量減少a步驟中索引項的大小個字節;(注:由于pos處原索引項已刪除,所以當前pos處實質上是原pos+1處索引項)
f. IMG數減1;
g. 重新計算data1、data2、data3;
h. data4文件中,在b步驟所記錄下的偏移量處,刪除等于a步驟中索引項的大小個字節。
4.替換IMG(REPLACE)
輸入:替換位置pos、替換后的IMG對象
處理方式:
a. 生成一個索引項:從目錄的pos處提取出來即可,其:偏移量 = 目錄在pos處索引項的偏移量,大小 = 目錄在pos處索引項的大小,名字不用管;
b. 記錄該索引項的偏移量,減去當前的data1、data2、data3的總長度之和,得到data4待替換數據在data4內部的偏移量,記錄下來;
c. 在目錄的pos處找到這個索引項,把大小變成IMG文件流的大小,其他不變;
e. 目錄中pos出之后的索引項,偏移量減少原索引項(步驟a提取出的索引項)的大小再增加IMG文件流的大小;
f. 重新計算data2、data3;
g. data4文件中,在c步驟所記錄的偏移量處,先刪除等于原索引項的大小個字節,再插入IMG文件流即可。
5.重命名(RENAME)
輸入:重命名位置pos、命名后的字符串
處理方式:
a. 將目錄中pos處索引項的名字變為命名后的字符串;
b.重新計算data2、data3。
以上
總結
以上是生活随笔為你收集整理的关于DNF的多媒体包NPK文件的那些事儿(4)- NPK文件操作流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模块定义文件导出类_浓缩的就是精华——E
- 下一篇: js时间搓化为今天明天_js转时间戳,时