PlayStation archive (PSARC)

From PS3 Developer wiki
Revision as of 05:25, 13 February 2015 by Sandungas (talk | contribs) (→‎create by filelist: merged)
Jump to navigation Jump to search

Description

PlayStation ARChive is a generic file container that uses an internal hierarchy of subfolders with defined access paths, and optional zlib or lzma per-file compression


The access paths are stored in a special file generated at build time called manifest, It mimics a standard tree structure of folders/files but the root of the hierarchy is not defined, this way the contents of the psarc can be "mounted" by the system/game as part of his filesystem at any place and under any device letter/name

There are 3 different methods to generate this paths that defines how the .psarc contents are mounted by the system/game, this methods are enabled by the archive flags stored in the header, the system/game knows how to recreate the filesystem paths and mounts the .psarc contents by reading the archive flags that are needed to process the access paths in the manifest


The compression algorithms, the PS3 system, and the .psarc format, allows for 9 compression levels but in the practise only are used level 0 (no compression) or 9 (max compression used as the default compression level)

Compression level 9 for generic file types results as a compression ratio of around 50% of the original size, the final compression ratio can vary for different types of files, usually multimedia files (video, audio, etc) doesnt admits much compression because are already compressed originally (as example, max compression ratio for .BIK video and .MP3 audio doesnt reachs 1% or 2%). For this reason is better to dont compress multimedia files because the size reduction is ridiculous and read access times can be reduced (causing a delay/lag/freeze when trying to load the file)

Very small files (smaller than 100 bytes or so) as well as dummy files (0 bytes) doesnt admits compression because are so small that the compression algorithm is not able to reduce them, they will be stored without compression inside the .psarc archive even when is applyed compression over them. When listing the contents of a .psarc with this kind of files will be displayed with a percentage of 100% and both his compressed and decompressed sizes the same value

Zlib Header (more info here and here)
byte index bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
[0] CMF Compression info
  • 7 = indicates a 32K window size
Compression method
  • 8 = denotes the "deflate" compression
[1] FLG FLEVEL
  • 0 - compressor used fastest algorithm
  • 1 - compressor used fast algorithm
  • 2 - compressor used default algorithm
  • 3 - compressor used maximum compression, slowest algorithm
FDICT

(Preset dictionary)

If set, a DICT dictionary identifier is present
immediately after the FLG byte. The dictionary is a sequence of
bytes which are initially fed to the compressor without
producing any compressed output. DICT is the Adler-32 checksum
of this sequence of bytes (see the definition of ADLER32
below).  The decompressor can use this identifier to determine
which dictionary has been used by the compressor.
FCHECK
value must be such that CMF and FLG, when viewed as
a 16-bit unsigned integer stored in MSB order (CMF *256 + FLG),
is a multiple of 31.

Structure

See Discussion page

Header

PSARC header example:

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000  50 53 41 52 00 01 00 04 7A 6C 69 62 00 01 23 BA  PSAR....zlib..#º
00000010  00 00 00 1E 00 00 09 16 00 01 00 00 00 00 00 02  ................
Offset Size Name Example Value (conversion) Notes
PSARC Header
0x00 0x04 magic 50 53 41 52 PSAR PlayStation ARchive
0x04 0x04 version 00 01 00 04 v1.4 First 2 bytes is the major version, next 2 bytes is the minor version
0x08 0x04 compression type 7A 6C 69 62 zlib zlib (default)
lzma
0x0C 0x04 toc length 00 01 23 BA 0x123BA
0x10 0x04 toc entry size 00 00 00 1E 30 Bytes Default is 30 bytes
0x14 0x04 toc entries 00 00 09 16 1 manifest + 2325 files The manifest is always included as the first file in the archive without an assigned ID
0x18 0x04 block size 00 01 00 00 65536 Bytes Default is 65536 bytes
0x1C 0x04 archive flags 00 00 00 02 Absolute paths 0 = relative paths (default)
1 = ignorecase paths
2 = absolute paths
  • Relative (default, no flags)
    • Default value when the .psarc is created from command line or an .xml and no special access paths modes are specifyed
    • The paths in the manifest doesnt have an slash character at the start of every line, the system accesses the files exactly like if the .psarc was a folder itself
    • In the games that uses .psarc's without flags (like uncharted series or the last of us) is posible to replace the psarc by a folder with the same name of the psarc and his contents decompressed inside
  • Ignorecase flag
    • Enabled by using the option --ignorecase in command line or ignorecase="true" in the .xml
    • The paths in the manifest are case insensitive (doesnt matters wich characters are in capitals)
  • Absolute flag
    • Enabled by using the option --absolute in command line or absolute="true" in the .xml
    • The paths in the manifest have an slash character at the start of every line,

TOC Table

Blocks info table

File table

The compression is applyed "per-block", is posible to know the compression level by looking at the zlib header

PSARC Tools

There are several versions of PSARC related tools, features has been implemented along the different versions and is hard to keep a record of them, please help filling the info in the page

GUI versions are derivated from the command line versions

Command line versions

Open PSARC PS3 Extractor

By Matthieu Milan. It allows you to extract PSARC archive data in linux

Source code: https://www.ferb.fr/ps3/PSARC/

PSARC tool

Port of Matthieu Milan's open PSARC PS3 extractor to Windows. Tool written by Matthieu Milan (@usineur). Ported to VS2012 by AlexAltea.

source code: https://github.com/AlexAltea/psarc-tool

Usage:
 psarc [option] filename

Options:
 -l                Create a text file that lists the file id, size, and name of every file in the archive.
 -x                Extracts all files.
 -e START END      Extracts files with the file id specified by the range between START and END (inclusive).

PSARC Extractor

By Insomniac @ xentax forums, download link: http://www.ps3hax.net/downloads.php?do=file&id=452 and http://www.modcontrol.com/Board/pc-tools/28869-psarc-ps3-extractor.html

Usage:
 PSARC [flag] <fileName>

Flags:
 -l             Creates a text file that lists the File ID, Size, and Name of every file in the archive.
 -e START END   Extracts files with the File ID specified by the range between START and END (inclusive). 
 <blank>        Extracts all files.
  • Examples:
    • Extract all files from data.psarc : PSARC data.psarc
    • Create list of files from data.psarc : PSARC -l data.psarc
    • Extract file with File ID 5 : PSARC -e 5 5 data.psarc
    • Extract files with File ID 7 through 12 : PSARC -e 7 12 data.psarc


The flag -l creates a .txt file with a list of all the contents of the archive, the info included is: File ID, File original size, and File path inside psarc archive

Example of a .txt file created with the -l flag:

ID       Size         Name
1      | 7,39 KB    | /my/files/dummies/dummy1.bin
2      | 8,80 KB    | /my/files/dummies/dummy2.bin
3      | 3,30 KB    | /my/files/dummies/dummy3.bin

PSARC

1.60.008 SDK : x
1.92.001 SDK : x
3.40.001 SDK : psarc-138.002 (C++), built on Feb 15 2010 at 16:17:41
3.41.001 SDK : psarc-138.002 (C++), built on Feb 15 2010 at 16:17:41
3.60.001 SDK : psarc-138.002 (C++), built on Feb 15 2010 at 16:17:41
3.70.001 SDK : psarc-138.002 (C++), built on Feb 15 2010 at 16:17:41
4.00.001 SDK : psarc-1310.001 (C++), built on Nov 16 2011 at 03:31:36
4.50.001 SDK : psarc-1310.001 (C++), built on Nov 16 2011 at 03:31:36

help

Type This
'''C:\>psarc.exe --help'''
'''usage:'''
 psarc verb [options] [file...]
 psarc --xml=XMLFILE
 
'''verbs:'''
 create                                  Create an archive. (default)
 extract                                 Extract contents of an existing archive.
 list                                    List contents of an existing archive.
 dump                                    Print detailed info about archive for unit testing.
 verify                                  Verify an existing archive's structural integrity and ensure that all files can be decompressed.
 dtd                                     Display a DTD describing psarc's XML input syntax.

'''general options:'''
 -h, --help                              Show this help message and exit.
     --version                           Display version and exit.
 -d, --debug                             Debug: Show debug messages.
 -v, --verbose                           Verbose: Show additional progress. (default)
 -q, --quiet                             Quiet: Don't show any progress.
 -y, --overwrite                         Overwrite existing files when creating/extracting.
 --xml=XMLFILE                           XML list of actions to perform.

'''create options:'''
 -oFILE, --output=FILE                   Archive filename to create.
 -IINPUTFILE, --inputfile=INPUTFILE      Inputfile listing files to archive. Consider --xml instead, which gives you more control.
 -m, --mself                             Create a PSARC-MSELF hybrid file for PS3, which can contain encrypted special files like SDATA, SPRX, and SPU SELF.
 --zlib                                  Use Zlib when compressing. (default)
 --lzma                                  Use LZMA when compressing. (usually for PS3 PSN)
 --level=N                               Compression quality. 1 is fastest, 9 is best. (default = 9)
 -N, --nocompress                        Store all files uncompressed in the archive.
 -bBS, --blocksize=BS                    Use blocks of size BS. (default = 64KiB)
 -jJOBS, --jobs=JOBS                     Compression threads to run at a time. (default = number of CPUs)
 -sREGEX, --strip=REGEX                  Perl-compatible regex specifying a prefix to strip from the pathnames stored in the archive. This may be specified more than once. (default = current dir)
 -S, --strip-all                         Strip all paths from files stored in the archive.
 -a, --absolute                          Make the paths within the archive absolute.
 -R, --relative                          Make the paths within the archive relative. (default)
 -i, --ignorecase                        Make the archive directory case-insensitive.
 --exclude=WILDCARD                      Wildcard specifying files to exclude.
 --skip-missing-files                    If set then ignore it when a file cannot be found.
 --mergedups                             Compare the content of all files, and merge identical files so that only one copy of the data is included.

'''extract options:'''
 --input=FILE                            Archive to extract files from. (default is first file argument)
 --to=DIRECTORY                          Directory to write extracted files to. (default is current directory)

dtd

  • Display a DTD describing psarc's XML input syntax.

The output of this command is a layout that defines the structure of an .xml document. See: http://www.w3schools.com/DTD/

Type This
'''C:\>psarc.exe dtd'''
<!ELEMENT psarc (create|extract)+>

<!ELEMENT create (compression|strip|exclude|file|directory|filelist)+>
<!ATTLIST create archive CDATA #IMPLIED
                 absolute (true|false) "false"
                 ignorecase (true|false) "false"
                 mergedups (true|false) "false"
                 stripall (true|false) "false"
                 blocksize CDATA "65536"
                 jobs CDATA #IMPLIED
                 skipmissingfiles (true|false) "false"
                 format (psarc|psarc-mself) "psarc"
                 overwrite (true|false) "false">

<!ELEMENT compression EMPTY>
<!ATTLIST compression type (zlib|lzma) "zlib"
                      level (1|2|3|4|5|6|7|8|9) "9"
                      enabled (true|false) "true">

<!ELEMENT strip EMPTY>
<!ATTLIST strip regex CDATA #REQUIRED>

<!ELEMENT exclude EMPTY>
<!ATTLIST exclude regex CDATA #IMPLIED
                  wildcard CDATA #IMPLIED>

<!ELEMENT file (CDATA)>
<!ATTLIST file wildcard CDATA #IMPLIED
               regex CDATA #IMPLIED
               path CDATA #IMPLIED
               archivepath CDATA #IMPLIED
               fromarchive CDATA #IMPLIED
               compressed (true|false) #IMPLIED
               skipifmissing (true|false) #IMPLIED>

<!ELEMENT filelist EMPTY>
<!ATTLIST filelist path CDATA #REQUIRED>

<!ELEMENT directory EMPTY>
<!ATTLIST directory path CDATA #REQUIRED
                    archivepath CDATA #IMPLIED
                    fromarchive CDATA #IMPLIED
                    compressed (true|false) #IMPLIED
                    skipifmissing (true|false) #IMPLIED>

<!ELEMENT extract (file)+>
<!ATTLIST extract archive CDATA #IMPLIED
                  input CDATA #IMPLIED
                  to CDATA #IMPLIED
                  stripall (true|false) "false"
                  skipmissingfiles (true|false) "false"
                  overwrite (true|false) "false">
  • DTD Notes:
    • Elements are defined in the DTD as: <!ELEMENT element-name (element-content)>
    • Attributes are defined in the DTD as: <!ATTLIST element-name attribute-name attribute-type attribute-value>
    • Elements that contains childrens elements that can be repeated several times are defined with a +
    • Character strings attribute data types are defined with: CDATA
    • Required attributes are defined with: #REQUIRED, and optional attributes with: #IMPLIED


Based in the DTD layout is posible to create an .xml layout that automatizes all the actions of the tool, this example is a generic layout containing all the elements and attributes availables together
Code Sample
  • XML Notes:
    • The purpose of this XML is to use it as a base layout containing all, but is not posible to use it like that, is needed to delete the tags that are not needed for a specific case, the ones that are incompatibles with other tags, and is needed to add paths, etc...
    • Some attributes appears as common in the DTD for "create" and "extract" but are not common, some of them has been deleted to avoid mistakes... but probably is needed to delete some more
    • Is posible to generate this kind of .xml by using as the source the output of the "list" command after applying over it some character strings replacing using regular expressions with a tool like http://findandreplace.codeplex.com/#

verify

  • Verify an existing archive's structural integrity and ensure that all files can be decompressed.
  • Output info per-file is: Validating <file ID/number>: - file path inside psarc archive - (file original size in bytes)
Type This
'''C:\>psarc.exe verify "C:\psarctests\source files\test.psarc"'''
Verifying C:\psarctests\source files\test.psarc
Validating 1: dummy.txt (0 bytes)
Validating 2: BMPfolder1/Image1.bmp (6220854 bytes)
Validating 3: JPGfolder1/JPGfolder2/Image2.jpg (12524 bytes)
Validating 4: PNGfolder1/PNGfolder2/PNGfolder3/Image3.png (6142 bytes)
Archive OK

dump

  • Print detailed info about archive for unit testing.
  • Output info per-file is: file path inside psarc archive - file original size - file compressed size - file block start offset ?
Type This
'''C:\>psarc.exe dump "C:\psarctests\source files\test.psarc"'''
Dumping C:\psarctests\source files\test.psarc
dummy.txt  os=0 cs=0 fb=1
BMPfolder1/Image1.bmp  os=6220854 cs=8018 fb=2
JPGfolder1/JPGfolder2/Image2.jpg  os=12524 cs=209 fb=97
PNGfolder1/PNGfolder2/PNGfolder3/Image3.png  os=6142 cs=6142 fb=98

list

  • List contents of an existing archive.
  • Output info per-file is: file path inside psarc archive - (file compressed size - file original size - compression percentage)
  • In the compression percentage: 100% is no reduction, 0% is a huge reduction
Type This
'''C:\>psarc.exe list "C:\psarctests\source files\test.psarc"'''
Listing C:\psarctests\source files\test.psarc
dummy.txt (0/0 100%)
BMPfolder1/Image1.bmp (8018/6220854 0%)
JPGfolder1/JPGfolder2/Image2.jpg (209/12524 1%)
PNGfolder1/PNGfolder2/PNGfolder3/Image3.png (6142/6142 100%)
Tip
Is posible to generate a text file containing the output of the list command by using the > arrow and the path/name of the destination file, this is usefull to convert the generated file to a filelist.txt or an automated.xml for rebuilding the psarc archive later
Type This
'''C:\>psarc.exe list "C:\psarctests\source files\test.psarc" > c:\psarctests\filelist.txt'''
There is no output in the command line, instead the file c:\psarctests\filelist.txt is created containing the output

create

  • Create an archive.

Ther are 3 different ways to create a psarc archive (by directory, by filelist, or by file). By directory creates the psarc using the contents of a specifyed folder and all subfolders, all them ordered alphabetically (windows style), this method cant be used to rebuild psarcs where every file needs to be assigned with an specific ID (and im not sure if is available in command line). By file means every path of every file in the PC is needed to be specifyed and this is not posible in command line when the archive has lot of files (for a single file is fine, but when are thousand of files is a no way)

create by directory

create by directory (xml)

Code Sample
Type This
'''C:\>psarc.exe --xml="c:\psarctests\CREATE by_directory.xml"'''
Strip: C:\psarctests\source files\test
Flags: relative
NumJobs: 2
Output: C:\psarctests\by_directory.psarc
Compression: zlib level 9
Archiving C:\psarctests\source files\test
Compressing TOC
Compressing C:\psarctests\source files\test\BMPfolder1\Image1.bmp
Compressing C:\psarctests\source files\test\dummy.txt
Compressing C:\psarctests\source files\test\JPGfolder1\JPGfolder2\Image2.jpg
Compressing C:\psarctests\source files\test\PNGfolder1\PNGfolder2\PNGfolder3\Image3.png

           4: Total Files Archived
     6239520: Original Size
         108: Manifest (uncompressed)
          72: Manifest (compressed)
         380: TOC size
        8836: Final Size
        4.3%: Directory Overhead
       99.9%: Compression Ratio
           9: Compression Level
'''C:\>psarc.exe list C:\psarctests\by_directory.psarc'''
Listing C:\psarctests\by_directory.psarc
BMPfolder1/Image1.bmp (8018/6220854 0%)
dummy.txt (0/0 100%)
JPGfolder1/JPGfolder2/Image2.jpg (209/12524 1%)
PNGfolder1/PNGfolder2/PNGfolder3/Image3.png (157/6142 2%)
create by filelist

The filelist is a plain .txt file where every file is defined by a single line, composed by his path, filename, and file extension, 1 line per file, in any order (not needed to be ordered alphabetically). Is posible to generate this kind of filelists automatically by using the output of the --list command and some regular expressions to replace characters (this is long explain and doesnt fits here by now)

As explained before, the examples used here in wiki uses full PC paths to be more flexible (no need to place psarc.exe next to the source folder, actually you can place psarc.exe in c:\ the source folder in d:\ and create the psarc in x:\). When using full paths is mandatory to use the --strip option with an explicit path or a regular expression (regex) to remove part of the PC path (e.g: if you strip C:\psarctests\source files\test from C:\psarctests\source files\test\BMPfolder1\Image1.bmp the resulting path of the file inside the archive will be BMPfolder1/Image1.bmp)

The --strip option removes part of the paths from the filelist, can be used several times with different stripped paths, this is usefull when the psarc archive is generated from a filelist that contains paths from different folders and/or devices in the PC (e.g: is posible to create a filelist including a file from F:\textures\packed\texture1.jpg and another file from G:\models\packed\model1.xxx and strip the paths: F:\textures\ and G:\models\, this way both files will be stored inside the psarc archive together under path: packed/texture1.jpg and packed/model1.xxx)


First is needed to prepare a filelist.txt like this example, located in C:\psarctests\source files\filelist.txt, contains the PC paths of the files that are in the folder C:\psarctests\source files\test and will be included inside the psarc archive:

C:\psarctests\source files\test\dummy.txt
C:\psarctests\source files\test\BMPfolder1\Image1.bmp
C:\psarctests\source files\test\JPGfolder1\JPGfolder2\Image2.jpg
C:\psarctests\source files\test\PNGfolder1\PNGfolder2\PNGfolder3\Image3.png

The psarc archive is created by using the filelist as the --inputfile and uses an explicit path to --strip from every file inside the filelist, this way:

Type This
'''C:\>psarc.exe create --strip="C:\psarctests\source files\test" --output=C:\psarctests\command_by_filelist.psarc --inputfile="C:\psarctests\source files\filelist.txt"'''

Or you can prepare an .xml that contains the path to the filelist.txt

Code Sample

Then run the contents of the .xml this way:

Type This
'''C:\>psarc.exe --xml="c:\psarctests\CREATE by_filelist.xml"'''

The output of the tool is the same in both cases (except the InputFile not present when using an xml)

Type This
Strip: C:\psarctests\source files\test
Flags: relative
NumJobs: 2
InputFile: C:\psarctests\source files\filelist.txt
Output: C:\psarctests\command_by_filelist.psarc
Compression: zlib level 9
Archiving C:\psarctests\source files\test\dummy.txt
Archiving C:\psarctests\source files\test\BMPfolder1\Image1.bmp
Archiving C:\psarctests\source files\test\JPGfolder1\JPGfolder2\Image2.jpg
Archiving C:\psarctests\source files\test\PNGfolder1\PNGfolder2\PNGfolder3\Image3.png
Compressing TOC
Compressing C:\psarctests\source files\test\dummy.txt
Compressing C:\psarctests\source files\test\BMPfolder1\Image1.bmp
Compressing C:\psarctests\source files\test\JPGfolder1\JPGfolder2\Image2.jpg
Compressing C:\psarctests\source files\test\PNGfolder1\PNGfolder2\PNGfolder3\Image3.png

           4: Total Files Archived
     6239520: Original Size
         108: Manifest (uncompressed)
          72: Manifest (compressed)
         380: TOC size
        8836: Final Size
        4.3%: Directory Overhead
       99.9%: Compression Ratio
           9: Compression Level
'''C:\>psarc.exe list C:\psarctests\by_filelist.psarc'''
Listing C:\psarctests\by_filelist.psarc
dummy.txt (0/0 100%)
BMPfolder1/Image1.bmp (8018/6220854 0%)
JPGfolder1/JPGfolder2/Image2.jpg (209/12524 1%)
PNGfolder1/PNGfolder2/PNGfolder3/Image3.png (157/6142 2%)
  • Notes:
    • The program replaces the windows slash "\" by "/" when storing the access paths inside the manifest file. When making a --list command over the created psarc the slashes will appear as "/" because this is how they was archived in the Manifest (manifest is the first file inside the psarc filetable, doesnt appears as a file when using the --list command and doesnt have an assigned ID)
create by file
Code Sample
Type This
C:\>psarc.exe --xml="c:\psarctests\CREATE by_file.xml"
Strip: C:\psarctests\source files\test
Flags: relative
NumJobs: 2
Output: C:\psarctests\by_file.psarc
Compression: zlib level 9
Archiving C:\psarctests\source files\test\dummy.txt
Archiving C:\psarctests\source files\test\BMPfolder1\Image1.bmp
Archiving C:\psarctests\source files\test\JPGfolder1\JPGfolder2\Image2.jpg
Archiving C:\psarctests\source files\test\PNGfolder1\PNGfolder2\PNGfolder3\Image3.png
Compressing TOC
Compressing C:\psarctests\source files\test\dummy.txt
Compressing C:\psarctests\source files\test\BMPfolder1\Image1.bmp
Compressing C:\psarctests\source files\test\JPGfolder1\JPGfolder2\Image2.jpg
    Storing C:\psarctests\source files\test\PNGfolder1\PNGfolder2\PNGfolder3\Image3.png

           4: Total Files Archived
     6239520: Original Size
         108: Manifest (uncompressed)
          72: Manifest (compressed)
         380: TOC size
       14821: Final Size
        2.6%: Directory Overhead
       99.8%: Compression Ratio
           9: Compression Level
'''C:\>psarc.exe list C:\psarctests\by_file.psarc'''
Listing C:\psarctests\by_file.psarc
dummy.txt (0/0 100%)
BMPfolder1/Image1.bmp (8018/6220854 0%)
JPGfolder1/JPGfolder2/Image2.jpg (209/12524 1%)
PNGfolder1/PNGfolder2/PNGfolder3/Image3.png (6142/6142 100%)

Batch. This is an useless example to show how the .psarcs are created sequentially and how to create several .psarc's with only one .xml, it uses all default values for compressions, formats, flags etc...

In step 1 it creates an egg.psarc containing a dummy.txt. In step 2 it creates a chiken.psarc containing the egg.psarc made in step 1. In step 3 it creates an egg.psarc containing the chicken.psarc made in step 2 (egg.psarc created in step 3 overwrites egg.psarc made in step 1)

Code Sample
Type This
'''C:\>psarc.exe --xml="c:\psarctests\CREATE by_file_paradox.xml"'''
Strip: C:\psarctests\source files\test
Flags: relative
NumJobs: 2
Output: C:\psarctests\egg.psarc
Compression: zlib level 9
Archiving C:\psarctests\source files\test\dummy.txt
Compressing TOC
Compressing C:\psarctests\source files\test\dummy.txt

           1: Total Files Archived
           0: Original Size
           9: Manifest (uncompressed)
           9: Manifest (compressed)
          96: TOC size
         105: Final Size
       91.4%: Directory Overhead
       -1.$%: Compression Ratio
           9: Compression Level

Strip: C:\psarctests
Flags: relative
NumJobs: 2
Output: C:\psarctests\chicken.psarc
Compression: zlib level 9
Archiving C:\psarctests\egg.psarc
Compressing TOC
Compressing C:\psarctests\egg.psarc

           1: Total Files Archived
         105: Original Size
           9: Manifest (uncompressed)
           9: Manifest (compressed)
          96: TOC size
         174: Final Size
       55.2%: Directory Overhead
      -65.7%: Compression Ratio
           9: Compression Level

Strip: C:\psarctests
Flags: relative
NumJobs: 2
Output: C:\psarctests\egg.psarc
Compression: zlib level 9
Archiving C:\psarctests\chicken.psarc
Compressing TOC
Compressing C:\psarctests\chicken.psarc

           1: Total Files Archived
         174: Original Size
          13: Manifest (uncompressed)
          26: Manifest (compressed)
          96: TOC size
         252: Final Size
       38.1%: Directory Overhead
      -44.8%: Compression Ratio
           9: Compression Level
'''C:\>psarc.exe list C:\psarctests\egg.psarc
Listing C:\psarctests\egg.psarc
chicken.psarc (143/174 82%)
'''C:\>psarc.exe list C:\psarctests\chicken.psarc
Listing C:\psarctests\chicken.psarc
egg.psarc (69/105 65%)

extract

  • Extract contents of an existing archive.
  • There are 3 optional available attributes for extract:
    • --overwrite (if the files existed in the extraction folder they will be overwritten without advise)
    • --strip-all (extracts all files in the root of the target folder, incase of several extracted files with the same name the program will return an error, this can be solved by using the command --overwrite)
    • --skip-missing-files (seems pointless, mostly to extract files from malformed .psarcs or .psarcs that doesnt passes the "verify" command ?)

The required options are --input (the source .psarc) and --to (the target folder where contents will be extracted)

extract all

The example command extracts all files from the .psarc to a directory with full directory tree names, no skipped missing files, no overwrite

When using this options the command line output is the same, there is no mention of wich files are stripped, overwritten, or missing in the extraction process

Type This
'''C:\>psarc.exe extract --input="C:\psarctests\source files\test.psarc" --to="C:\psarctests\test"'''
Extracting: dummy.txt (0 bytes)
Extracting: BMPfolder1/Image1.bmp (6220854 bytes)
Extracting: JPGfolder1/JPGfolder2/Image2.jpg (12524 bytes)
Extracting: PNGfolder1/PNGfolder2/PNGfolder3/Image3.png (6142 bytes)
'''C:\>psarc.exe extract --overwrite --strip-all --skip-missing-files --input="C:\psarctests\source files\test.psarc" --to="C:\psarctests\test"'''
Extracting: dummy.txt (0 bytes)
Extracting: BMPfolder1/Image1.bmp (6220854 bytes)
Extracting: JPGfolder1/JPGfolder2/Image2.jpg (12524 bytes)
Extracting: PNGfolder1/PNGfolder2/PNGfolder3/Image3.png (6142 bytes)

extract all (xml) To use an .xml is needed to prepare it before using psarc.exe, using an xml is the most flexible way to use psarc.exe because allows to place the source (files to create, or psarc to extract), target (files to create, or psarc to extract), and psarc.exe in any path of the PC, it allows the usage of a filelist.txt (that defines all files inside the archive), create psarcs based in a directory, or specify all the files inside the xml, also to specify the compression level for every file (needed for video or audio files that doesnt admits compression), etc...

Is also the most complicated method because is needed to specify full PC paths inside the xml, and when creating is needed to specify regular expressions to strip part of the PC path

When the xml is ready you can run it this way:

Type This
'''C:\>psarc.exe --xml=c:\psarctests\extract_custom_folders.xml'''

The options --verbose, --debug, and --quiet cant be used inside the xml, so if needed are specifyed in the command line, this way:

Type This
'''C:\>psarc.exe --debug --xml=c:\psarctests\create_custom_folders.xml'''
Code Sample
Type This
'''C:\>psarc.exe --xml="c:\psarctests\EXTRACT all.xml"'''
Extracting: dummy.txt (0 bytes)
Extracting: BMPfolder1/Image1.bmp (6220854 bytes)
Extracting: JPGfolder1/JPGfolder2/Image2.jpg (12524 bytes)
Extracting: PNGfolder1/PNGfolder2/PNGfolder3/Image3.png (6142 bytes)
extract by file

This extraction method is only available when using an xml because command line doesnt allows to use per-file attributes

Code Sample
Type This
'''C:\>psarc.exe --xml="c:\psarctests\EXTRACT by_file.xml"'''
Extracting: BMPfolder1/Image1.bmp (6220854 bytes)

When extracting single files is also posible to use the same attributes availables in command line, and attributes per-file, but they uses different names inside the xml (see the DTD example)

Code Sample
  • Notes about the xml examples above:
    • The element "extract" uses the attribute archive but could be replaced by input, in this case are exactly the same and both will work, actually --input is the same option used in comand line but the examples in wiki uses the name archive because is more intuitive (is also used as an attribute for "create" and in both cases is refered to the compressed archive.psarc). Both (archive and input) appears in the DTD as optional (#IMPLIED) but only one of them can be used in the xml
    • The element "file" uses the attribute archivepath but could be replaced by path, in this case are exactly the same and both will work, but the examples in wiki uses the name archivepath because is more intuitive (is refered to the path of a file inside archive.psarc). Both (archivepath and path) appears in the DTD as optional (#IMPLIED) but only one of them can be used in the xml
    • To identify the paths inside the psarc archive use --list option in command line. By default the paths inside the psarc are relative (path names starts with the name of the folder) but in some cases the paths starts with a slash"/" (when the psarc has been created with absolute flag), in this case the slash needs to be specifyed as part of the path here (e.g: archivepath="Folder1/Image1.bmp" is a relative path, and archivepath="/Folder1/Image1.bmp" is an absolute path)

Total Commander plugin

http://www.totalcmd.net/plugring/PSARC.html

GUI versions

PS3 PSARC GUI

It's a graphical user interface to view, extract or create psarc archives. GUI written by aldo, unknown psarc tool used internally

Download link: http://aldostools.org/ps3_psarc_gui.rar

Related Tools

When rebuilding a psarc is needed to preserve the original positions of all the files inside the archive (because every file in the original psarc has assigned an ID number, and after rebuilding this numbers must match with the original positions). for this same reason when rebuilding is not a good idea to remove files (because the other files that comes after will be displaced). When the purpose of the rebuild is to reduce the sze (by removing languages, etc...) the method consists in replacing them by dummies (0kb files), this dummies preserves the positions of all the files

To be sure all the files are in the correct positions can be used as a base file (to edit later) the output of the list command as explained before

This edition of the file generated by the list command can be automated completly (not needed to edit a single character by hand). Is posible to generate a filelist.txt or an automated.xml by replacing/erasing/adding characters with other programs that identifies and replaces characters by using regular expressions, the examples used here are commands for fnr.exe (find and replace tool) and contains regular expressions (to search) and a character string (to replace)

  • The file paths inside filelist.txt or inside an automated.xml admits 2 formats:
    • full PC paths (where the full PC file path included the device letter is used by psarc.exe to locate the file in any device and/or any folder). This method is the most flexible but needs an strip command to remove part of the PC path when creating the psarc archive
    • relative to work directory paths (where work directory is the path to psarc.exe and the files needs to be placed in a subfolder under it). This method needs to copy psarc.exe to the parent folder of the files

Generating a filelist with regular expressions

Generating an xml with regular expressions

Games or Apps using PSARC files

PS3 icon
Game/App info PSARC Header info Compression
Method
Notes
TITLE PSARC files Version
(offset 0x04)
Compression
(offset 0x08)
TOC entry size
(offset 0x10)
Block Size
(offset 0x18)
Flags
(offset 0x1C)
Ape Escape sound.psarc 00010004 zlib 0000001E 00010000 00000000 (no flags) no compress Contains not-compressed audio
<language>.psarc 00010004 zlib 0000001E 00010000 00000002 (absolute) compress all
target.psarc 00010004 zlib 0000001E 00010000 00000002 (absolute) compress all TOC dupes!!!, see notes below
Atelier Rorona Plus ? 00010004 zlib 0000001E 00010000 00000002 (absolute) ?
Eiyuu Densetsu Sen no Kiseki data.psarc
Eiyuu Densetsu Sen no Kiseki II data.psarc
God of War III All 00010004 zlib 0000001E 00010000 00000002 (absolute) compress all
God of War Ascension INTROCIN.PSARC no compress Intro video
CRTN.PSARC
CYN.PSARC
FURY.PSARC
HECA.PSARC
HRTN.PSARC
LAN.PSARC
PHI.PSARC
STAT.PSARC
STINT.PSARC
TEM.PSARC
per-file compress Contains not-compressed audio, and other compressed files
game levels, and game levels soundtracks
RESOURCES.PSARC per-file compress Game resources, included not-compresed audio
<LANGUAGE>.PSARC per-file compress Contains not-compressed audio, and other compressed files
SHELL.PSARC
TPPS.PSARC
compress all Main menu
Game updates stub (dummy file)
GAME.PSARC
(or all others ?)
00010004 zlib 0000001E 00010000 00000002 (absolute) compress all Game settings
ICO & Shadow of the Colossus HD
Killzone 3 data_ps3.psarc 00010004 zlib 0000001E 00010000 00000001 (ignorecase) compress all created from 3 working directories, lot of duplicated paths
Mass Effect 3 AUDIO.PSARC 00010004 lzma 0000001E 00010000 00000003 (ignorecase + absolute) no compress Contains not-compressed audio
MAIN.PSARC 00010004 lzma 0000001E 00010000 00000003 (ignorecase + absolute) per-file compress Contains not-compressed video, and other compressed files
TEXTURES.PSARC
Motorstorm Pacific Rift ?
Ni No Kuni bd03.adat ?
hd01.adat ?
hd05<language>.adat ?
.psarc file extensions renamed to .adat
Ninja Gaiden 3 Razors Edge
Ratchet & Clank. Tools of Destruction *_uncached.psarc 00010002 zlib 0000001E 00010000 00000003 (ignorecase + absolute) per-file compress Contains not-compressed audio, and other compressed files
All others 00010002 zlib 0000001E 00010000 00000003 (ignorecase + absolute) compress all
Ratchet & Clank. Quest for Booty *_uncached.psarc 00010002 zlib 0000001E 00010000 00000003 (ignorecase + absolute) per-file compress Contains not-compressed audio, and other compressed files
All others 00010002 zlib 0000001E 00010000 00000003 (ignorecase + absolute) compress all global_cached.psarc contains TOC dupes!!! (icon0.png)
Ratchet & Clank. A Crack in Time *_uncached.psarc 00010003 zlib 0000001E 00010000 00000003 (ignorecase + absolute) per-file compress Contains not-compressed audio, and other compressed files
All others 00010003 zlib 0000001E 00010000 00000003 (ignorecase + absolute) compress all
Ratchet & Clank. Into the Nexus global_cached.psarc
level_cached.psarc
00010003 zlib 0000001E 00010000 00000003 (ignorecase + absolute) per-file compress Contains not-compressed files, and other compressed files
global_uncached.psarc
global_sound_**.psarc
00010003 zlib 0000001E 00010000 00000003 (ignorecase + absolute) per-file compress Contains not-compressed audio, and other compressed files
All others 00010003 zlib 0000001E 00010000 00000003 (ignorecase + absolute) compress all
The Last Of Us All ? 00010003 zlib 0000001E 00010000 00000000 (no flags)
The Shoot All 00010004 zlib 0000001E 00010000 00000002 (absolute)
Time and Eternity
Uncharted 2 All ? 00010003 zlib 0000001E 00010000 00000000 (no flags)
Uncharted 3 All 00010003 zlib 0000001E 00010000 00000000 (no flags)
Warhawk ?
White Knight Chronicles II All .psarc 00010003 zlib 0000001E 00010000 00000002 (absolute) no compress Contains not-compressed audio
All .psarc.sdat 00010003 zlib 0000001E 00010000 00000002 (absolute) compress all Default compression, NPD signed psarcs
Wipeout HD Fury data01.psarc 00010003 zlib 0000001E 00010000 00000003 (ignorecase + absolute) no compress Contains not-compressed audio
All others 00010003 zlib 0000001E 00010000 00000003 (ignorecase + absolute) compress all
PS4 icon
Game/App info PSARC Header info Compression
Method
Notes
TITLE PSARC files Version
(offset 0x04)
Compression
(offset 0x08)
TOC entry size
(offset 0x10)
Block Size
(offset 0x18)
Flags
(offset 0x1C)
VidZone vidzone*.db.psarc 00010004 zlib 0000001E 00010000 00000000 (no flags) compress all Vidzone is a web service, the .psarc is hosted in the web


  • Special rebuild notes:
    • Mass effect 3 MAIN.PSARC contains a group of generic files compressed with level 9, and another group of .TXT, .BIN, and .BIK videos not compressed at all. In the creation options suggested above in the table the compression level is not defined and this means all them will use the default compression level 9 (so the .BIK files will have a ridiculous 1% or 2% of compression ratio because is the max they will admit). This is not how the original file was created (but works), the correct way to rebuild it is by defining specific compression levels "per file" in a predefined .xml
    • Killzone 3 data_ps3.psarc (BCES01007 version) contains 8324 files (included 5.3GB of audio files for 21 languages with a compression of around 50%)... 2883 of all the files uses the same path/filenames repeated up to 3 times (because was created using 3 or more different working directories). This duplication of paths/filenames inside the .psarc in the practise means when doing a standard extraction 2833 files will be missing, overwrited, or they will give an error at extraction time, the correct way to mess with it is by doing several partiall extractions to different directories, and rebuild it by using a preconfigured .xml where the different paths for each file are specifyed, when rebuilding is also needed to use the --strip option several times to remove part of the paths from all the different working directories, this way the paths/filenames will be duplicated inside the .psarc archive (but are different files located at different positions and with a different ID number assigned).
    • Ape Escape target.psarc includes "dupes" (or duplicated files) in the TOC (table of contents) of the psarc archive. This method used at creation time basically works by making several entries of the TOC to point to the same file, this way a single file inside the psarc is indexed several times in the TOC and can be accessed from several different paths/filenames. The only way to identify this dupes before extraction is by reading the TOC of the psarc for all the files and compare wich position are pointing to. As an example the original size of target.psarc is 328mb... after a "standard" extraction is 2.52GB (this extraction doesnt identify the dupes so are extracted several times under different paths/filenames)... if you try to rebuild it again his final size will be much bigger than the original target.psarc
  • Other games that probably uses PSARC's
    • Uncharted 1?
    • Killzone colletion ?
    • God of War. Collection ?
    • other Motorstorms ?