pak是chrome中跨平台的资源管理文件格式,比如用于多语言,本地文件(html数据)或数据的格式化管理等;对于pak文件处理,chrome提供了C++类和python脚本的方式来处理。
pak文件格式:(Data File Format version 4)
uint32 文件版本
uint32 文件中的资源数量
uint8 文件中资源内容的编码(0: 二进制;1: utf8编码;2: utf16编码)
<uint16 resource id, uint32 file offset>*
two zero bytes, uint32 end of last file
<resource data>*
格式详细参考:http://www.chromium.org/developers/design-documents/linuxresourcesandlocalizedstrings
关于C++DataPack
类
支持读取和生成pak格式文件。
通过int16型的resource_id来查询对应的资源,resource_id一般统一宏定义在头文件中。
读取pak文件的例子:
#include <testing/gtest/include/gtest/gtest.h>
#include "base/prg.h"
#include "base/path_service.h"
#include "base/resource/data_pack.h"
TEST(DataPackTest, Format)
{
base::DataPack dp;
base::FilePath exepath;
PathService::Get(base::FILE_EXE, &exepath);
// data = { 1: "", 4: "this is id 4", 6: "this is id 6", 10: "" }
bool success = dp.LoadFromPath( exepath.DirName().Append( _P("datapack1.pak" )));
ASSERT_TRUE(success);
base::StringPiece ret;
dp.GetStringPiece(4, &ret);
std::string str_ret = ret.as_string();
ASSERT_TRUE( str_ret == "this is id 4" );
}
关于data_pack.py
脚本
详见:src/tools/grit/grit/format/data_pack.py
下面是利用data_pack.py,将json格式的文件转化为pak文件的脚本示例,其中json文件格式如下:
{
"1" : "",
"4" : "this is id 4"
}
python脚本如下:
#!/usr/bin/env python
import os
import sys
import json
if __name__ == '__main__':
sys.path.append(os.path.join(os.path.dirname(__file__), '../../../third_party/grit'))
from grit.format import data_pack
def main():
if len(sys.argv) > 1:
file_object = open(sys.argv[1])
json_str = ''
try:
json_str = file_object.read()
finally:
file_object.close()
data = {}
json_data = json.loads(json_str)
for key in json_data:
data[int(key)] = json_data[key]
data_pack.WriteDataPack(data, sys.argv[1] + ".pak", data_pack.UTF8)
if __name__ == '__main__':
main()