DCX

From DarkSoulsDev
Jump to: navigation, search

DCX files are just Zlib compressed data with some headers, notice the ASCII 'x' before the hex mess. Offsets are always relative to their chunk, so add them to the chunk magic position. Structure names are speculated from the meaning I could guess. Note that for some reason data is stored as big-endian.

DCX

Offsets.

struct DcxPackage  // DCX
{
  /* 0x00 */  uint32_t magic;            // 0x44435800, for 'DCX '
  /* 0x04 */  uint16_t unk1;             // always 1 ?
  /* 0x06 */  uint16_t unk2;             // always 0 ?
  /* 0x08 */  uint32_t dcs_offset;       // offset to DCS chunk (= 0x18)
  /* 0x0C */  uint32_t dcp_offset;       // offset to DCP chunk (= 0x24)
  /* 0x10 */  uint32_t unk3;             // seems equal to dcp_offset
  /* 0x14 */  uint32_t unk4;             // seems to point after DFLT (= 0x2C)
}

DCS

Sizes.

struct DcxSizes  // DCS
{
  /* 0x00 */  uint32_t magic;              // 0x44435300, for 'DCS '
  /* 0x04 */  uint32_t uncompressed_size;  // size of uncompressed data
  /* 0x08 */  uint32_t compressed_size;    // size of ZLIB compressed data
}

DCP

Zlib parameters.

struct DcxParameters  // DCP
{
  /* 0x00 */  uint32_t magic;       // 0x44435000, for 'DCP '
  /* 0x04 */  char method[4];       // seem to always be 'DFLT'
  /* 0x08 */  uint32_t dca_offset;  // offset to DCA chunk (= 0x20)
  /* 0x0C */  uint32_t unk1;        // always 9, might be compression level (9 is Zlib max)
  /* 0x10 */  uint32_t unk2;
  /* 0x14 */  uint32_t unk3;
  /* 0x18 */  uint32_t unk4;
  /* 0x1C */  uint32_t unk5;        // always 0x00010100, might be Zlib version (1.1.0)
}

DCA

Offset to data, apparently useless because it's always right after this chunk, so the offset is always 8.

struct DcxData  // DCA
{
  /* 0x00 */  uint32_t magic;       // 0x44434100, for 'DCA '
  /* 0x04 */  uint32_t data_offset  // offset to ZLIB compressed data (= 8)
}

Zlib compressed data

Zlib data. Decompress it with usual default Zlib parameters.