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()