public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[ signature:=")
                .append(new String(getSignature(), UTF_8))
                .append(System.getProperty("line.separator"));
        sb.append("version:=\t")
                .append(getVersion())
                .append(System.getProperty("line.separator"));
        sb.append("header_len:=\t")
                .append(getHeader_len())
                .append(System.getProperty("line.separator"));
        sb.append("unknown_00c:=\t")
                .append(getUnknown_000c())
                .append(System.getProperty("line.separator"));
        sb.append("block_len:=\t")
                .append(getBlock_len())
                .append(" [directory chunk size]")
                .append(System.getProperty("line.separator"));
        sb.append("blockidx_intvl:=")
                .append(getBlockidx_intvl())
                .append(", density of quickref section, usually 2")
                .append(System.getProperty("line.separator"));
        sb.append("index_depth:=\t")
                .append(getIndex_depth())
                .append(", depth of the index tree - 1 there is no index, 2 if there is one level of PMGI")
                .append(" chunk")
                .append(System.getProperty("line.separator"));
        sb.append("index_root:=\t")
                .append(getIndex_root())
                .append(", chunk number of root index chunk, -1 if there is none")
                .append(System.getProperty("line.separator"));
        sb.append("index_head:=\t")
                .append(getIndex_head())
                .append(", chunk number of first PMGL (listing) chunk")
                .append(System.getProperty("line.separator"));
        sb.append("unknown_0024:=\t")
                .append(getUnknown_0024())
                .append(", chunk number of last PMGL (listing) chunk")
                .append(System.getProperty("line.separator"));
        sb.append("num_blocks:=\t")
                .append(getNum_blocks())
                .append(", -1 (unknown)")
                .append(System.getProperty("line.separator"));
        sb.append("unknown_002c:=\t")
                .append(getUnknown_002c()).append(", number of directory chunks (total)")
                .append(System.getProperty("line.separator"));
        sb.append("lang_id:=\t")
                .append(getLang_id())
                .append(" - ")
                .append(ChmCommons.getLanguage(getLang_id()))
                .append(System.getProperty("line.separator"));
        sb.append("system_uuid:=")
                .append(Arrays.toString(getSystem_uuid()))
                .append(System.getProperty("line.separator"));
        sb.append("unknown_0044:=")
                .append(Arrays.toString(getUnknown_0044()))
                .append(" ]");
        return sb.toString();
    }
Directory header The directory starts with a header; its format is as
follows: 0000: char[4] 'ITSP' 0004: DWORD Version number 1 0008: DWORD Length
of the directory header 000C: DWORD $0a (unknown) 0010: DWORD $1000 Directory
chunk size 0014: DWORD "Density" of quickref section, usually 2 0018: DWORD
Depth of the index tree - 1 there is no index, 2 if there is one level of
PMGI chunks 001C: DWORD Chunk number of root index chunk, -1 if there is none
(though at least one file has 0 despite there being no index chunk, probably
a bug) 0020: DWORD Chunk number of first PMGL (listing) chunk 0024: DWORD
Chunk number of last PMGL (listing) chunk 0028: DWORD -1 (unknown) 002C:
DWORD Number of directory chunks (total) 0030: DWORD Windows language ID
0034: GUID {5D02926A-212E-11D0-9DF9-00A0C922E6EC} 0044: DWORD $54 (This is
the length again) 0048: DWORD -1 (unknown) 004C: DWORD -1 (unknown) 0050:
DWORD -1 (unknown)
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/chm/ChmItspHeader.java