Chunk type-specific data structures

Chunks with data of type 0xEE and sub-type 0x0011 contain data organized as a record.

Chunk type-specific data structures are used by the event audit system to store the event log, and by the ZIMT scripting language to store properties and parameters of variables. This record format appears to be indicated by one or more values in record data (one of them being the first byte of the record data). The record formats of the chunk types given here are guesses.

Data type

Chunk data

Sub-type

Byte length of and record data

Record data

0

1

2

3

4

5

6

7

8

n

0xEE

0x11

0x00

LSB

MSB

ZIMT parameter and property chunks

The record data of the chunks with data type 0xEE and sub-type 0x0011 is described in the tables below. For the sake of brevity, the following definition of record elements will be used:

byte

1 byte

byte (boolean)

1 byte with values limited to 0x00 and 0x01

word

2-byte integer

long

4-byte integer

single

4-byte single-precision float

double

8-byte double-precision float

string

variable-length unicode string (see Unicode strings)

list

variable-length data list (see Lists of data)

tuple

ordered group of values

ZIMT property chunks

Chunk type name

Record data

Count

Type

QS_Par

1

byte 0x01

1

byte (boolean)

2

byte

1

byte (boolean)

Chunk type name

Record data

Number

Type

QS_ValPar

1

byte 0x01

1

double

1

string

1

word

1

list of doubles

1

list of bytes

1

byte 0x00

Record contains value, unit, and ID. Lists are often empty.

Chunk type name

Record data

Number

Type

QS_TextPar

1

byte 0x01

4

string

String 2 contains language information,
strings 3 and 4 are empty.

Chunk type name

Record data

Number

Type

QS_SelPar

1

byte 0x02

1

long

1

list of longs

4

string

The first long is 0xFFFFFFFF if the list is not empty.
String 2 contains language information,
strings 3 and 4 are empty.

Chunk type name

Record data

Number

Type

QS_ValArrPar

1

byte 0x02

1

string

1

word

1

byte, usually 0x00

1

list of longs

The word contains an ID value.

Chunk type name

Record data

Number

Type

QS_ValArrParElem

1

byte 0x02

1

list of tuples of type (long, double)

Tuples are pairs of index and value.

Chunk type name

Record data

Number

Type

QS_ArrPar

1

byte 0x02

1

list of longs

1

byte

ZIMT parameter chunks

Chunk type name

Record data

Number

Type

QS_ParProp

1

byte 0x07

9

byte (boolean)

1

word

9

string

3

word

5

string

1

long 0x00000000

2

word

1

byte

1

string

4

byte (boolean)

Bytes 6 and 9 seem to always be 0x00.
The 3 words are 0x0000, 0xFFFF, 0xFFFF.
The last 4 bytes are 0x00, 0x01, 0x00, 0x01.

or

Chunk type name

Record data

Number

Type

QS_ParProp

1

byte 0x07

9

byte (boolean)

1

word

9

string

3

word

5

string

1

long 0x00000002

2

word

1

byte

1

long

1

string

4

byte (boolean)

The last 4 bytes are 0x00, 0x01, 0x00, 0x01.

Chunk type name

Record data

Number

Type

QS_ValProp

1

byte 0x01

1

byte (boolean)

2

byte

1

byte (boolean)

Chunk type name

Record data

Number

Type

QS_TextProp

1

byte 0x01

4

byte

4

byte (boolean)

The last byte is 0x01

Chunk type name

Record data

Number

Type

QS_SelProp

1

byte 0x04

3

byte (values)

1

list of 4 strings

1

list of 4 strings

1

list of strings

1

list of strings

1

list of words

1

list of longs

1

list of strings

Record data may end after the first three bytes.
If present, all lists are of the same length.

Chunk type name

Record data

Number

Type

QS_ValArrParProp

1

byte 0x02

4

byte

1

word

4

byte

Chunk type name

Record data

Number

Type

QS_SkalProp

1

byte 0x02

2

string

2

byte (boolean)

First string may contain a ZIMT script.
The booleans seem to indicate validity of the respective strings.

Chunk type name

Record data

Number

Type

QS_ValSetting

1

byte 0x02

2

string

1

long

1

string

3

byte

1

word

2

byte

1

list of words

1

list of strings

1

byte

10

byte

The leading strings are usually empty.
The long is small-valued.
The word is either 0x0000 or 0xFFFF.
If not empty, the list of words contains ID values.
If not empty, the last string contains a variable name.

Chunk type name

Record data

Number

Type

QS_NumFmt

1

byte 0x02

4

byte

1

double

The value of the double float is usually 0.1.

Chunk type name

Record data

Number

Type

QS_Plaus

1

byte 0x01

9

byte, usually 0x00

6

byte, usually 0xFF or 0x00

1

word, usually 0xFFFE or 0x0000

6

byte, usually 0xFF or 0x00

1

word, usually 0x7FFE or 0x00

6

byte, usually 0x00

Note that data in this chunk differ from QS_Tol
only in length.

Chunk type name

Record data

Number

Type

QS_Tol

1

byte 0x01

9

byte, usually 0x00

6

byte, usually 0xFF or 0x00

1

word, usually 0xFFFE or 0x0000

6

byte, usually 0xFF or 0x00

1

word, usually 0x7FFE or 0x00

3

byte, usually 0x00

Note that data in this chunk differ from QS_Plaus
only in length.

Event audit chunk

The event audit log is stored in a chunk type with name Entry. The description below represents the parsing algorithm used before version 0.3.0. In the current implementation, the chunk is parsed heuristically as bytes and strings.

[START OBSOLETE DESCRIPTION]

The first byte of the record (i.e., format code) corresponding to the description here is 0x02. A large number of Entry–Record-Format-Codes (ERFC) and associated records are defined. However, it appears to be possible to split the record data into its constituents without interpreting the format code explicitly. The procedure is described in the Section Parsing algorithm.

In addition to strings, the following prefixed data types are defined that are specific to Entry chunks:

Prefix

Data block

Total length of data type (bytes)

Length (bytes)

Interpretation

0x07

8

1 double

9

0x64

4

1 long

5

0x01

4

4 bytes

5

0x04

1

1 byte

2

Data type and chunk data of an Entry chunk start as follows:

Data type

Chunk data

Sub-type

Byte length of format code and record data

Record data

Format

ERFC

3-tuple

String

0

1

2

3

4

5

6

7

8

9

10

11

0xEE

0x11

0x00

LSB

MSB

0x02

Parsing algorithm

The following algorithm appears to be able to parse record data data into a list, regardless of record format code. The algorithm is completely heuristic and is able to extract a lot of meaningful information. However, it should be replaced with an algorithm evaluating the ERFC code.

  1. Go to start of record.

  2. Read and output ERFC byte.

  3. Interpret next 3 bytes as 3-tuple and output.

  4. While there are bytes left to parse:

  1. If string follows: interpret and output string, continue at 3.

  2. If the next byte belongs to a prefixed data type and another prefixed data type or string follows the current data block: interpret prefixed data type and output, continue at 3.

  3. If another prefixed data type or string follows 4 bytes later: interpret 4 bytes as 2 words and output, continue at 3.

  4. If another prefixed data type or string follows 2 bytes later: output 2 bytes, continue at 3.

  5. Output next byte, continue at 3.

The test for follow-up prefixed data type or string needs to verify that either the end of the string is reached or

  1. that the following data starts with a prefix defined for prefixed data types or with a string length followed by 0x00 0x80, indicating strings, and

  2. that the following number of bytes is sufficient to hold the entire prefixed data type or string.

The purpose of the follow-up test is to prevent the detection of spurious unicode string markers LSB MSB 0x00 0x80 in the binary prepresentation of double-precision floating point numbers.

Interpretation

Each Entry record begins with a common header, followed by a detailed, entry-specific record. The common header contains the following entries:

  1. Entry-record-format-code

  2. 3-tuple

  3. User name currently logged into the system

  4. Time in seconds, possibly since loading/saving a file.

  5. An ID (always the same)

  6. Empty string

  7. Another ID (always the same)

  8. The value 0

  9. A string giving a human-readable, brief description of the event

  10. Internal string describing the originator of the event

[END OBSOLETE DESCRIPTION]